1.介绍:
工厂方法模式Factory Method,又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
2.定义:
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
3.结构
UML
工厂模式-1.jpgHeadFirst
4代码实现:
Pizzastore
protocol PizzaStoreProtocol {
func createPizza(type: String) -> PizzaProtocol
}
//这里相当于Java中的抽象类
class PizzaStore: PizzaStoreProtocol {
//禁止子类重写,导致其它的操作
final func orderPizza(type: String) -> PizzaProtocol {
let pizza = createPizza(type: type)
//pizza的其它操作
pizza.prepare()
pizza.bake()
pizza.cut()
pizza.box()
return pizza
}
//swift没有抽象类,只在用协议实现,这里还得返回一个默认值
func createPizza(type: String) -> PizzaProtocol {
return Pizza()
}
}
Pizza
protocol PizzaProtocol {
var name: String { get set }
var sauce: String { get set }
var dough: String { get set }
func prepare()
func bake()
func cut()
func box()
}
class Pizza: PizzaProtocol {
var name: String = "Unknow Pizza"
var sauce: String = "Unknow Sauce"
var dough: String = "Unknow Daugh"
var toppings: [String] = [] //pizza上面要放的东西
func prepare() {
print("Preparing + \(name)")
print("Tossing dough...")
print("Adding sauce...")
print("Adding toppings...")
}
func bake() {
print("Bake for 25 minutes for 350")
}
func cut() {
print("Cutting the pizza into diagonal slice")
}
func box() {
print("Place pizza in offical Pizzastore Box")
}
}
具体工厂NYStylePizzaStore
class NYStylePizzaStore: PizzaStore {
override func createPizza(type: String) -> PizzaProtocol {
switch type {
case "cheese":
return NYStyleCheesePizza()
case "pepperoni":
return NYStylePepperoniPizza()
case "clam":
return NYStyleClamPizza()
case "veggie":
return NYStyleVeggiePizza()
default:
return Pizza()
}
}
}
使用
let nyStore = NYStylePizzaStore()
let nyStyleCheesePizza = nyStore.orderPizza(type: "cheese")
总结
优点
:克服了简单工厂违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性,所以说“工厂模式”是“简单工厂模式”的进一步抽象和推广。
缺点
:每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。
网友评论