java设计模式之工厂设计模式(Factory)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java设计模式之工厂设计模式(Factory)相关的知识,希望对你有一定的参考价值。
设计模式根据使用类型可以分为三种:
1、 创建模式: Factory (工厂模式)、 Singleton (单态)、 Builder ( (建造者模式)、 Prototype ( (原型模式)、工厂方法模式。
2、 结构模式: Flyweight ( (共享模式)、 Bridge ( (桥模式)、 Decorator ( (装饰模式)、 Composite ( (组合模式)、 Adapter (适配器模式)、 Proxy ( (代理模式)、 Facade ( (外观模式)。
3、 行为模式: Iterator (迭代模式) 、Template ( (模板模式)、 Chainof Responsibility ( ( 责 任 链 模 式 ) 、 Memento ( ( 纪 念 品 模 式 ) 、Mediator ( (中介模式)、 Interpreter ( (解释器模式)、
Strategy (策略模式)、 State 、 Observer ( (观察者模式)、 Visitor ( (访问模式)、Command ( (命令模式)。
一、工厂模式(Factory)
工厂模式是在我们日常开发过程中使用频率非常高的一种设计模式,其定义:Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses(定义一个创建对象的接口,让子类决定实例化哪个具体的类,并且使类的实例化放到子类中去).简单的来说工厂模式就是就创建对象的时候类似于工厂一样根据用户的不同需求去生产不同的产品,从而避免了客户每需要一种新的产品就需要一个专门的公司去生产(即需要去new 不同的对象)
简单工厂模式(Simple Factory):具体代码链接
场景:有两种角色的人(老师、学生),不适使用工厂模式的时候需要分别去new这两种类型的对象,使用工厂模式之后只需要在工厂类中根据不同的特性分别去创建不同的对象
优点:
1、实现了对责任的分割,对象的创建都在工厂内完成避免了客户端去创建产品
2、客户端只需要知道创建的产品名而不必关心具体的产品的类名
3、可以通过引入配置文件的方式在不修改客户端代码的前提下更换和增加新的实体产品
缺点:
1、所有的对象的创建都在工厂类完成,一旦工厂类出现异常整个系统都要受到影响
2、会增加系统中类的个数,增加了系统的复杂度
3、系统扩展性差,在新增加了产品就必须修改工厂类的代码
Person类:
工厂类:
学生的实现类:
老师的实现类:
消费者类:
工厂方法(Factory Method):代码链接
工厂方法模式和简单工厂模式相比,抽象了工厂角色和产品角色,并将每个具体类的实例化放到了子类当中去了
场景:现有两种角色的人(老师、学生)都需要参加考试这项活动,但是因为角色的不同在这项活动中的动作也不同(学生参加考试,老师监考)
优点:
1、用户值只需要关心产品对应的工厂,无需关键创建细节
2、该模式的多态性设计使得工厂可以自主确定创建何种产品对象,而创建的细节是封装在实体工厂的内部
3、加入新产品时无需修改抽象工厂和抽象产品,只需要添加一个实体工厂和一个实体的产品类即可,符合ocp原则
缺点:
1、在增加新产品时需要编写新的实体产品类以及与之对应的实体工厂类,在一定成都上增加了系统的复杂度,给整个系统带来额外的开销
2、在客户端中使用了抽象层定义,增加了系统的抽象性和理解难度,而且实现时使用到了反射,一定成都上增加了系统实现的难度
抽象产品类:
具体实现类:
抽象工厂类:
工厂实现类:
消费者类:
抽象工厂(Abstract Factory):代码链接
场景:现需要生产两款手机(iPhone 7和华为P10)
优点:
1、隔离了具体类的生成,使用户不需要关心实体产品什么时候被创建了
2、当一个抽象产品的多个对象(例如华为P系列手机中的P8、P9、p10)设计成实现同一个抽象产品时,能够保证客户端只使用同一种产品
缺点:
1、添加新的产品时难以扩展抽象工厂
抽象工厂类:
实体工厂类:
抽象产品类:
实体产品类:
消费者类:
总结:
工厂设计模式的使用主要时为了降低整个系统模块之间的耦合成都,增加系统的可扩展性,在新增或修改功能时不修改或尽量少的修改原有的代码,使得后期的系统维护变得更加简单
以上是关于java设计模式之工厂设计模式(Factory)的主要内容,如果未能解决你的问题,请参考以下文章
Java设计模式之工厂模式(Factory Pattern)
Java设计模式之工厂模式(Factory Pattern)