关于工厂模式的一些总结
工厂模式里面大概包括三种细分的设计模式:简单工厂模式,工厂方法模式,抽象工厂模式。
最近花时间三个一起研究了一遍,因为其设计思想是一致的(其实,所有的设计模式的本质都是一致的,只是招数不同罢了),将三种方法一起对比有助于加深理解学习。
所谓工厂模式,就是用工厂方法将需要的类实例化。需要实例化的类就像工厂里面的产品,需要用的时候就“生产”一个。
【简单工厂】
在工厂类里面包含必要的逻辑判断,根据客户端的选择条件动态实例化相关的类。(摘自《大话设计模式》)
从百度上找来一张图,这样就容易理解多了。
关于Product接口,是具体产品类的抽象,为什么要抽象出来?因为SimpleFactory可以在实例化Product时实现向上转换。
用通俗的例子就是:
客户给厂家下生产U盘的订单,要求可以实现传输的功能,并交待了A君在厂区等货。
只要产品是U盘,不管是什么牌子,形状,颜色的,都可以收购。U盘就代表抽象类,厂家可能生成各种各样的U盘,但只要继承U盘这个抽象类接口,就可以卖出去。
如果不用抽象类呢?
那厂家就要交待A君要具体收购哪种牌子的U盘,金士顿,DTrave?
1,如果要收购的种类有1000种,A君就要记忆1000种产品,
2,如果厂家扩展了产品线研发了新的U盘,但是因为A君的产品种类与自己公司的产品需求耦合严重,新的U盘要卖出去,就要修改A君公司要收购的种类,这种修改会导致很多问题。
3,……
【工厂方法】
工厂方法就是在简单工厂的基础上,将工厂类的逻辑判断等分离出一个个子工厂类,然后根据情况实例化工厂类。再百度一张图片帮助理解:
工厂方法的好处就是可以根据需求实例化相关的工厂类。把工厂类抽象出一个接口,有多个具体生成对象的工厂。
实际原理也就跟为什么要把产品类分开,并抽象出一个抽象的产品类一样,这个要自己理解了。
当然我们不一定要严格遵循这个格式去做,实际上,我也看过一些例子是没有抽象出工厂类的,但是它像工厂方法一样有很多子工厂,怎么做要依照情况而定。而不是一成不变。
那真正不变的本质是什么?
其实就是将自己要实例化的对象方便地实例化就行了,至于怎么做,才有工厂模式的出现!就像下面的抽象工厂为什么会出现一样。
【抽象工厂】
抽象工厂是工厂方法的延伸,当工厂只需要生成一个产品种类的功能是,是工厂方法,当需要具有生成多个产品种类,就是抽象工厂,附图:
总结:
条条大道通罗马,只要能高效解决问题,方法都是次要的,上面三种工厂方法,都只是为了可以应付生产产品这种情况,在实际编程中,应该灵活运用。