摘要:二简单工厂模式组成工厂类工厂模式的核心,通过调用它来实现其他类的功能。三工厂方法模式利用工厂方法模式可以有效解决简单工厂模式破坏开闭原则的问题。
一、概念
1、工厂模式分为三类:
(1)简单工厂模式:一个工厂创建所有产品
(2)工厂方法模式:一个工厂方法创建一个产品
(3)抽象工厂模式:一个工厂方法创建一类产品
2、创建型模式
这种模式是指将实例的创建和使用分离开来,隐藏类实例的创建细节,外界对于对象只需要知道它们共同的接口即可。
1、组成
(1)工厂类:工厂模式的核心,通过调用它来实现其他类的功能。
(2)抽象产品角色
(3)具体产品角色:继承抽象工厂角色,工厂类就是创建此角色的实例。
2、举例
想要说明这个模式,我们可以看一个简单的例子
(1)首先创建一个Operation抽象类,作为抽象产品角色
public abstract class Operation { private int operator1; private int operator2; public int getOperator1() { return operator1; } public int getOperator2() { return operator2; } public void setOperator1(int operator1) { this.operator1 = operator1; } public void setOperator2(int operator2) { this.operator2 = operator2; } protected abstract int getResult(); }
(2)如果我们想要实现加减法运算,可以写一个类继承Operation类,并且重写getResult方法。
public class OperationAdd extends Operation { @Override public int getResult(){ return getOperator1() + getOperator2(); } } public class OperationMinus extends Operation { @Override public int getResult(){ return getOperator1() - getOperator2(); } }
(3)如果我们要进行加减法运算,可以直接调用这两个类创建出的实例的方法,但是简单工厂模式希望我们能够另外建立一个工厂,并且用这个工厂来创建加减法类的实例。因为这样我们就不需要知道具体类的名字,只需要传入加减法的符号即可。
public class Factory { public static Operation createOperation(String operator){ Operation op = null; switch (operator){ case "+": op = new OperationAdd(); break; case "-": op = new OperationMinus(); break; } return op; } }
(4)这样我们的main函数就可以写成这样子。
public static void main(String []args){ Operation add = Factory.createOperation("+"); add.setOperator1(100); add.setOperator2(60); System.out.println(add.getResult()); }
3、存在的问题
我们可以考虑一下这种方式存在的问题,使用简单工厂模式,可以不用知道具体类的名字,直接交给工厂来创建。
但是这样一来,如果我们想要增加新的运算,即给工厂增加新的产品,首先写新类,还要更改工厂类,增加新的switch判断逻辑,也就不符合开闭原则(对修改关闭,对扩展开放)。
三、工厂方法模式
利用工厂方法模式可以有效解决简单工厂模式破坏开闭原则的问题。
工厂方法模式在简单工厂模式基础上的主要变化在于,增加了一个抽象工厂接口,让每个具体工厂类去实现抽象工厂接口,这样用户就不用关心具体工厂类创建的细节。
1、举例
还是对于运算器这个例子,我们根据工厂模式进行修改。
(1)创建抽象工厂接口
public interface TemplateFactory { Operation CreateOperation(); }
(2)创建加法工厂,实现抽象工厂接口
public class AddFactory implements TemplateFactory{ public Operation CreateOperation(){ return new OperationAdd(); } } public class MinusFactory implements TemplateFactory{ public Operation CreateOperation(){ return new OperationMinus(); } }
(3)main函数
public static void main(String []args){ TemplateFactory factory = new AddFactory(); Operation add = factory.CreateOperation(); add.setOperator1(100); add.setOperator2(60); System.out.println(add.getResult()); }
使用工厂方法模式,能够实现高度解耦,需要增加新的产品时,只需要增加相关的类和工厂即可,不需要改动已有的产品和工厂。
2、存在的问题
使用工厂方法模式的主要问题在于,每次增加一个产品,都需要新增至少两个类,这会增加系统的复杂性。
抽象工厂模式中提到一个产品族的概念,根据前面两个工厂模式,简单工厂是一个工厂“生产”所有产品,工厂方法是一个工厂生产一个产品。
而抽象工厂就是一个工厂生产一个产品族,产品族这个概念,是指位于不同产品等级结构中,功能相关的产品组成的家族。
1、举例
比如我们现在两个产品族,HUAWEI手机族和XIAOMI手机族,两个族中又分别包含商务机和时尚机这两种不同产品等级的手机类型,那么我们需要建立两个工厂:HUAWEI工厂和XIAOMI工厂,每个工厂里又分别提供生产商务机和时尚机。这里就不通过代码来说明了。
工厂模式的主要目的,就是为了将实例对象的创建和使用分开,所以工厂干的事情,就是实例化对象。
而三种方式的联系可以通过这张图来帮助理解。
http://www.hollischuang.com/w...
参考:
http://www.hollischuang.com/w...
你以为工厂模式很简单,可能是因为你懂的只是冰山的一角
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75320.html
摘要:在设计模式中,所有的设计模式都遵循这一原则。其实就是说在应用程序中,所有的类如果使用或依赖于其他的类,则应该依赖这些其他类的抽象类,而不是这些其他类的具体类。使用设计模式是为了可重用代码让代码更容易被他人理解保证代码可靠性。 这是刘意老师的JAVA基础教程的笔记讲的贼好,附上传送门 传智风清扬-超全面的Java基础 一、面向对象思想设计原则 1.单一职责原则 其实就是开发人员经常说的高...
摘要:第二章创建和销毁对象何时以及如何创建对象,何时以及如何避免创建对象,如何确保他们能够适时地销毁,以及如何管理对象销毁之前必须进行的各种清理动作。表示工厂方法所返回的对象类型。 第二章 创建和销毁对象 何时以及如何创建对象,何时以及如何避免创建对象,如何确保他们能够适时地销毁,以及如何管理对象销毁之前必须进行的各种清理动作。 1 考虑用静态工厂方法代替构造器 一般在某处获取一个类的实例最...
摘要:前言设计模式填坑系列,紧接前文距离上次写笔记又过去了一个多月,我也不知道怎么加班加着加着就一个月了正文定义工厂模式是指提供一个创建对象的接口而不保留具体的创建逻辑,可以根据输入类型创建对象。 前言 设计模式填坑系列,紧接前文(距离上次写笔记又过去了一个多月,我也不知道怎么加班加着加着就一个月了-_-!) 正文 定义 工厂模式是指提供一个创建对象的接口而不保留具体的创建逻辑,可以根据输入...
摘要:生成的包首次被访问时,在全局包注册表中自动地注册。然而,类似于资源工厂注册表,这种显式注册的过程仅当独立运行时被要求,在下运行时通过扩展指针来自动地完成。通过使用合适的资源工厂,就可以确定被产生的和被使用的持久化形式。 持久化(Persistence) EMF拥有一个强大的模型持久化框架。通过一个高度可定制资源实现(resource implementation)来支持XML序列化...
摘要:生成的包首次被访问时,在全局包注册表中自动地注册。然而,类似于资源工厂注册表,这种显式注册的过程仅当独立运行时被要求,在下运行时通过扩展指针来自动地完成。通过使用合适的资源工厂,就可以确定被产生的和被使用的持久化形式。 持久化(Persistence) EMF拥有一个强大的模型持久化框架。通过一个高度可定制资源实现(resource implementation)来支持XML序列化...
阅读 2450·2021-10-08 10:17
阅读 1827·2021-09-06 15:02
阅读 2541·2019-08-29 17:30
阅读 2665·2019-08-29 13:24
阅读 1525·2019-08-29 11:12
阅读 3339·2019-08-28 17:52
阅读 667·2019-08-26 11:30
阅读 3578·2019-08-26 11:01