工厂模式
1. 简单工厂模式
- 参与者
- 工厂(Factory)角色:接受客户端的请求,通过请求负责创建相应的产品对象。
- 抽象产品(Abstract Product)角色:是工厂模式所创建对象的父类或是共同拥有的接口。可是抽象类或接口。
- 具体产品(ConcreteProduct)对象:工厂模式所创建的对象都是这个角色的实例。
- 优缺点
- 工厂类含有必要的创建何种产品的逻辑,这样客户端只需要请求需要的产品,而不需要理会产品的实现细节。
- 工厂类只有一个,它集中了所有产品创建的逻辑,它将是整个系统的瓶颈,同时造成系统难以拓展。
- 简单工厂模式通常使用静态工厂方法,这使得工厂类无法由子类继承,这使得工厂角色无法形成基于继承的等级结构。
- 类图
-
简单工厂的生活场景,卖早点的小摊贩,他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂,它生产包子,馒头,地沟油烙的煎饼。
-
2. 工厂方法模式
- 参与者
- 抽象工厂角色:与应用程序无关,任何在模式中创建对象的工厂必须实现这个接口。
- 具体工厂角色:实现了抽象工厂接口的具体类,含有与引用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
- 抽象产品角色:工厂方法所创建产品对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
- 具体产品角色:这个角色实现了抽象产品角色所声名的接口。工厂方法所创建的每个具体产品对象都是某个具体产品角色的实例。
- 优缺点
- 有很好的扩展性,降低了工厂类的内聚,满足了类之间的层次关系,又很好的符合了面向对象设计中的单一职责原则,这样有利于程序的拓展
- 而且对抽象的使用更佳深入,将工厂类也抽象为了抽象工厂类和工厂子类,外界调用更加灵活,这也是对多态的一种体现。
- 工厂方法模式的缺点也是非常显而易见的,工厂方法模式中新增一个抽象子类,意味着工厂子类要跟着成对增加(OC中最多要x4),这样会造成生成过多的类,工厂方法模式的复杂度也会随之增加。
-
类图
3. 抽象工厂模式
- 参与者
- 抽象工厂(Abstract Factory)角色: 担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
- 具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
- 抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
- 具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
- 抽象工厂模式与工厂方法模式的区别:
- 工厂方法模式:每个抽象产品派生多个具体产品类,每个抽象工厂类派生多个具体工厂类,每个具体工厂类负责一个具体产品的实例创建;
- 抽象工厂模式:每个抽象产品派生多个具体产品类,每个抽象工厂派生多个具体工厂类,每个具体工厂负责多个(一系列)具体产品的实例创建。
-
类图
总结
从简单工厂模式到工厂模式,再到抽象工厂模式。可以看到整个模式的一步步演进。简单工厂模式在产品多样之后,整个工厂将会变得臃肿而难以维护。于是我们将简单工厂模式中的工程做了抽象处理,这样每种产品对应一个工厂。这样无疑会增加代码量。但是好处是显而易见的,单独让一个工厂处理一种产品会让逻辑变得好维护。但是这样还不够,因为增加新的品类,就会产生新的类,对于调用者来说,处理太多具有相同接口的类显然是不合算的。于是,我们使用抽象工厂模式来解决这个问题。我们让抽象工厂内部做一个封装,用以隐藏真正的具体工厂。这样,对于调用者来说,即时内部增加了新的产品,你也是不知道的。
参考资料
iOS 三种工厂模式(简单工厂模式、工厂模式、抽象工厂模式)
iOS中的设计模式——工厂模式(Factory)
网友评论