美文网首页设计模式
2、HeadFirst--工厂模式

2、HeadFirst--工厂模式

作者: barry | 来源:发表于2019-03-14 14:37 被阅读12次

    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--工厂模式

        本文链接:https://www.haomeiwen.com/subject/jvvqmqtx.html