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

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

一、简单工厂模式

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

二、工厂方法模式

定义:工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。

使用的设计原则:依赖倒置原则(要依赖抽象,不要依赖具体类)。对修改关闭,对扩展开放。

类图:

总结:

  1、工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

  2、工厂方法,可以接受传参(称为“参数化工厂方法”),根据传入的参数不同创建不同的对象。也可以不接受传参,只产生一种对象,不需要参数化。

  3、利用字符串传参,有点危险,万一拼错,可能会造成所谓的“运行时错误”,所以避免方式为在编译时期就将参数的错误挑出来。比如:可以创建代表参数类型的对象、使用常量、枚举 enum。

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

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

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

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

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

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

三、依赖倒置原则

贴上书上的一段话:

  

四、抽象工厂模式 

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

类图:

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

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

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

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

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

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

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

 五、全文总结

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

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

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

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

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

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

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

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

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

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

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

猜你喜欢

转载自www.cnblogs.com/yuxiaole/p/9276396.html