2、HeadFirst--工厂模式

1.介绍:

工厂方法模式Factory Method,又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

demo地址,欢迎star

2.定义:

工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

3.结构

UML

工厂模式-1.jpg

HeadFirst

工厂模式.jpg

demo地址,欢迎star

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")

总结

优点:克服了简单工厂违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性,所以说“工厂模式”是“简单工厂模式”的进一步抽象和推广。

缺点:每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。

demo地址,欢迎star

你可能感兴趣的:(2、HeadFirst--工厂模式)