1. 前言
定义
工厂模式可以简单概括为同类型不同型号的产品
有各自对应的工厂
进行生产。好比如iPhone手机旗下有iPhoneX及iPhone8两种型号的手机,iPhoneX有自己iPhoneX的专属工厂进行生产,而iPhone8有自己iPhone8的专属工厂进行生产。两条生产线没有交集互不影响,后期如果新增或废弃相关类型的产品也不会影响到原有的生产线。
名词解释
- 工厂(Factory)角色:接受客户端的请求,通过请求负责创建相应的产品对象。
- 抽象产品(Abstract Product)角色:是工厂模式所创建对象的父类或是共同拥有的接口。可是抽象类或接口。
- 具体产品(ConcreteProduct)对象:工厂模式所创建的对象都是这个角色的实例。
三种模式
- 简单工厂模式:简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
-
工厂模式:抽象了工厂接口的具体产品,应用程序的调用不同工厂创建不同产品对象。(
抽象产品
) -
抽象工厂模式:在工厂模式的基础上抽象了工厂,应用程序调用抽象的工厂发发创建不同产品对象。(
抽象产品+抽象工厂
)
2.代码实现
- 简单工厂模式
SFOperation *sfOperation = [SFFactory operationBreakfast:SFFactoryProductTypeMantou];//只有一个简单的工厂去生产产品。不好扩展产品
[sfOperation productBreakfast];//产品自身的逻辑
NSLog(@"生产产品:%@",sfOperation.product);
- 工厂模式
//馒头
FFOperation *ffOperation = [FFactoryMantou createOperation];//不同工厂生产不同产品
[ffOperation productBreakfast];
NSLog(@"生产产品:%@",ffOperation.product);
//油条
FFOperation *ffOperation = [FFactoryMantou createOperation];//不同工厂生产不同产品
[ffOperation productBreakfast];
NSLog(@"生产产品:%@",ffOperation.product);
- 抽象工厂模式
AFFactory *afFactory = [AFFactory factoryWithType:AFFactoryProductTypeMantou];//抽象工厂 直接生产不同产品
AFOperation *afOperation = [afFactory createProduct];
[afOperation productBreakfast];
NSLog(@"生产产品;%@",afOperation.product);
3.总结
优点:客户端调用简单明了,不需要关注太多的逻辑。
缺点:也正是所谓的优点,导致了工厂类中揉杂了太多的业务逻辑,产品类本身是符合开闭原则的,对扩展开放对修改关闭,但是工厂类却违反了开闭原则,因为每增加一个产品,工厂类都需要进行逻辑修改和判断,导致耦合度太高所以工厂模式相对简单工厂模式的优点显而易见,如果业务逻辑很简单可以选择简单工厂模式,如果业务逻辑复杂还是选择工厂模式好。
不过个人觉得抽象模式还是比较复杂的,而且扩展扩展起来也不是很灵活,如果产品族非常多的话会生成很多产品类出来,是一件恐怖的事情。所以有人结合简单工厂模式和工厂模式,利用反射(java)机制对抽象工厂模式进行优化,避免生成太多的产品类。感兴趣的同学可以看看这篇文章
从简单工厂模式到工厂模式,再到抽象工厂模式。可以看到整个模式的一步步演进。简单工厂模式在产品多样之后,整个工厂将会变得臃肿而难以维护。于是我们将简单工厂模式中的工程做了抽象处理,这样每种产品对应一个工厂。这样无疑会增加代码量。但是好处是显而易见的,单独让一个工厂处理一种产品会让逻辑变得好维护。但是这样还不够,因为增加新的品类,就会产生新的类,对于调用者来说,处理太多具有相同接口的类显然是不合算的。于是,我们使用抽象工厂模式来解决这个问题。我们让抽象工厂内部做一个封装,用以隐藏真正的具体工厂。这样,对于调用者来说,即时内部增加了新的产品,你也是不知道的。