初识设计模式(工厂模式 总)

前言:继续学习设计模式,前面学习了策略模式、观察者模式、装饰者模式,今天学习工厂模式。除了使用 new 操作符之外,还有更多制造对象的方法,比如下面讲到的简答工厂模式、工厂方法模式、抽象方法模式。转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9276396.html

一、简单工厂模式

详见:https://www.cnblogs.com/yuxiaole/p/9280695.html

二、工厂方法模式

详见:https://www.cnblogs.com/yuxiaole/p/9281281.html

简单工厂和工厂方法模式的区别?

  1、工厂方法中的子类的确看起来很想简单工厂。简单工厂把全部的事情,在一个地方处理完了,然而工厂方法模式却是创建一个框架,让子类决定要如何实现。

  2、简单工厂,不具备工厂方法模式的弹性,因为简单工厂不能变更正在创建的产品。

  3、简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

  4、在简单工厂模式中,工厂类与分支耦合,也就是说如果要新加一个(在工厂类中加一个分支)类,需要在工厂类里去加“Case”分支条件的,就会导致修改原有的类,违背了开放-封闭原则。于是工厂方法模式就来了,但是工厂方法模式在这种情况下虽然避免了修改工厂类,但是就得无法避免的去修改客户端的代码。

  5、工厂方法模式是简单工厂模式的进一步抽象和推广。由于工厂方法模式使用了多态性,工厂方法模式保持了简单工厂模式的有点,而且克服了它的缺点。

简单工厂和工厂方法模式的优点

  1、将创建对象的代码集中在一个对象或方法中,可以避免代码的重复,并且更方便以后的维护,同时解耦。这也意味着客户在实例化对象时,只会依赖于接口,而不是具体类。

  2、让代码更具有弹性,可以应对未来的发展。

三、依赖倒置原则

贴上书上的一段话:

  

 

 

四、抽象工厂模式 

定义:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

使用的设计原则:开放-关闭原则、依赖倒转原则

类图:

优点

  1、便于交换产品系列。工厂的实例化(AbstractFactory factory = new ConcreteFactory1();),在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂(factory = new ConcreteFactory2();)即可使用不同的产品配置。

  2、让具体的创建实例过程与客户端分离,客户端是通过它的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。

  3、是开放-关闭设计原则、依赖倒转设计原则的良好运用。

缺点

  1、抽象工厂模式是方便交换产品系列,但需求为增加功能,比如增加一个产品,则需要改的类有很多。

抽象工厂和工厂方法的区别

  1、都是负责创建对象,但工厂方法用的是继承,而抽象工厂是通过对象的组合。

  2、利用工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法(创建对象)。整个工厂方法模式,就是通过子类来创建对象。用这种做法,客户只需要知道他们所使用的抽象类型就可以了,而由子类来负责决定具体类型。所以,换句话说,工厂方法模式只负责将客户从具体类型中解耦出来。

  3、抽象工厂也做到了将客户从具体类型中解耦出来,只是方式不一样。抽象工厂提供一个用来创建一个产品家族的抽象类型,这个类型的子类定义了产品被产生的方法。要想使用这个工厂,必须先实例化它,然后将它传入一些针对抽象类所写的代码中。

  4、抽象工厂可以把一群相关的产品集合起来。当需要创建产品家族和想让制造的相关产品集合起来时,可以使用抽象工厂

  5、当需要把客户代码从需要实例化的具体类中解耦,或者如果目前还不知道将来需要实例化哪些具体类时,可以使用工厂方法。使用工厂方法很简单,只需要继承,然后实现父类的工厂方法即可。

  6、抽象工厂的方法经常以工厂方法模式的方法实现。

 五、全文总结

  1、所有的工厂都是用来封装 对象的创建。

  2、简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类中解耦。

  3、工厂方法模式使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。

  4、抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。

  5、所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合。

  6、工厂方法允许类将实例化延迟到子类进行。

  7、抽象工厂创建相关的对象家族,而不需要依赖他们的具体类。

  8、依赖倒置原则,指导我们避免依赖具体类型,而要尽量依赖抽象。

  9、工厂是很很有威力的技巧,帮助我们针对抽象编程,而不要针对具体类编程。

  10、所有在用简单工厂方法的地方,都可以考虑用反射的技术来去除 switch 或 if ,解除分支判断带来的耦合。

 

转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9276396.html

 

参考书籍:《Head First 设计模式》《大话设计模式》

posted @ 2018-07-08 17:46  取个名字吧  阅读(236)  评论(0编辑  收藏  举报