一、工厂模式分为三类:
(1)简单工厂模式:一个工厂建立全部产品
(2)工厂方法模式:一个工厂方法建立一个产品
(3)抽象工厂模式:一个工厂方法建立一类产品ide
二、建立型模式
这种模式是指将实例的建立和使用分离开来,隐藏类实例的建立细节,外界对于对象只须要知道它们共同的接口便可。函数
一、组成
(1)工厂类:工厂模式的核心,经过调用它来实现其余类的功能。
(2)抽象产品角色
(3)具体产品角色:继承抽象工厂角色,工厂类就是建立此角色的实例。this
二、举例
想要说明这个模式,咱们能够看一个简单的例子
(1)首先建立一个Operation抽象类,做为抽象产品角色code
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()); }
三、存在的问题
咱们能够考虑一下这种方式存在的问题,使用简单工厂模式,能够不用知道具体类的名字,直接交给工厂来建立。get
可是这样一来,若是咱们想要增长新的运算,即给工厂增长新的产品,首先写新类,还要更改工厂类,增长新的switch判断逻辑,也就不符合开闭原则(对修改关闭,对扩展开放)。产品
3、工厂方法模式
利用工厂方法模式能够有效解决简单工厂模式破坏开闭原则的问题。
工厂方法模式在简单工厂模式基础上的主要变化在于,增长了一个抽象工厂接口,让每一个具体工厂类去实现抽象工厂接口,这样用户就不用关心具体工厂类建立的细节。it
一、举例
仍是对于运算器这个例子,咱们根据工厂模式进行修改。
(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()); }
使用工厂方法模式,可以实现高度解耦,须要增长新的产品时,只须要增长相关的类和工厂便可,不须要改动已有的产品和工厂。
二、存在的问题
使用工厂方法模式的主要问题在于,每次增长一个产品,都须要新增至少两个类,这会增长系统的复杂性。
抽象工厂模式中提到一个产品族的概念,根据前面两个工厂模式,简单工厂是一个工厂“生产”全部产品,工厂方法是一个工厂生产一个产品。
而抽象工厂就是一个工厂生产一个产品族,产品族这个概念,是指位于不一样产品等级结构中,功能相关的产品组成的家族。
一、举例
好比咱们如今两个产品族,HUAWEI手机族和XIAOMI手机族,两个族中又分别包含商务机和时尚机这两种不一样产品等级的手机类型,那么咱们须要创建两个工厂:HUAWEI工厂和XIAOMI工厂,每一个工厂里又分别提供生产商务机和时尚机。这里就不经过代码来讲明了。
工厂模式的主要目的,就是为了将实例对象的建立和使用分开,因此工厂干的事情,就是实例化对象。
而三种方式的联系能够经过这张图来帮助理解。
http://www.hollischuang.com/w...
参考:
http://www.hollischuang.com/w...你觉得工厂模式很简单,多是由于你懂的只是冰山的一角