工厂模式是什么?做什么用的?
个人的理解:工厂模式定义了一个接口,对某些具有相似功能或者行为的类或者子类的实例化进行了封装。
三种工厂模式
简单工厂模式
如下图:

总结:Factory把类A,B,C的实例化封装在自己内部,外部使用的时候,只需要传达指令,然后接收工厂返回的实例对象。
优点:将类的实例化封装起来,使得对象实现实例化和使用分离开来,调用者不需要关注过多的实例化细节。
缺点:扩展方面不灵活,增删改对象的实例化都需要修改工厂类,并且容易造成工厂类的代码臃肿
工厂模式
如下图:

总结:Factory作为一个父类存在,具体各个类的实例方法封装在对应的子类工厂中。外部使用的时候,给对应的子类工厂发送指令
优点:工厂模式其实是对简单工厂模式的扩展,保留了简单工厂的优点,同时避免了工厂类过于庞大以及业务逻辑臃肿
不足的地方:使用的时候,需要用专门对应的类去实例化对象,且一个子类工厂只能生成一种对应的产品。
新增产品的时候,需要专门添加新的产品类
抽象工厂
如下图:

总结:Factory作为一个接口存在,具体各个类的实例化交给内部对应的类去做。外部使用的时候,发送指令给Factory。
(从使用上看,简单工厂和抽象工厂的表现形式是一样的。)
优点: 保留了简单工厂调用上的便利,同时也保留了工厂模式的可扩展性
不足的地方:新增产品需要新增产品类并修改Factory内部逻辑
运用实例
抽象工厂的运用,可以看一下OC提供的系统类NSNumber
NSNumber * num1 = [NSNumber numberWithInt:3]; // 生成对应的 __NSCFNumber实例
NSNumber * num2 = [NSNumber numberWithBool:NO]; // 生成对应的 __NSCFBoolean实例
给工厂类NSNumber
发送numberWithInt:
消息,NSNumber
内部会使用工厂__NSCFNumber
进行真正的实例化操作
给工厂类NSNumber
发送numberWithBool:
消息,NSNumber
内部会使用工厂__NSCFBoolean
进行真正的实例化操作
网友评论