从设计模式的类型上来讲,简单工厂模式是属于建立型模式,又叫作静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定建立出哪种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,能够理解为是不一样工厂模式的一个特殊实现。 html
下面模拟使用简单工厂模式实现的需求:java
需求:假设如今的咱们须要对数据库中的内容进行输出,须要依赖于一个输出的类,但如今有两种方式进行输出,分别是:excel与word;(这里我简单模拟,所以代码会很简单);数据库
首先咱们先用写一个输出方式的接口,代码以下:编程
public interface Print { public void outPrint(); }
2.而后须要写出它的两个实现类,以下:
excel方式:设计模式
public class ExcelImpl implements Print { @Override public void outPrint() { System.out.println("使用excel进行导出"); } }
word方式:ide
public class WordImpl implements Print { @Override public void outPrint() { System.out.println("使用word进行导出"); } }
3.而后实现一个工厂类:this
public class PrintFactory { /** * 用于获取print实例的方法 * */ public Print getPrint() { /** * 这里默认返回的是excel方式进行导出 * */ return new ExcelImpl(); } }
4.进行简单工厂方式的实现:编码
public class DataOutput { public static void main(String[] args) { /** * 实例化工厂类 * */ PrintFactory printFactory = new PrintFactory(); /** * 实例化调用的类,经过构造方法来对DataOutput对象进行初始化 * */ DataOutput dataOutput = new DataOutput(printFactory.getPrint()); dataOutput.output(); } private final Print print; public DataOutput(Print print) { this.print = print; } /** * 模拟导出,这里就是须要调用其余对象中的方法进行实现 */ public void output() { print.outPrint(); } }
好了,接下来咱们只要点击运行就会在控制台出现:使用excel进行导出;
若是因为需求的改变须要使用word来进行导出,很简单,咱们只须要修改工厂类中的方法便可,其余都不须要变:spa
public class PrintFactory { /** * 用于获取print实例的方法 * */ public Print getPrint() { /** * 这里默认返回的是excel方式进行导出 * */ // return new ExcelImpl(); /** * 更改成使用word方式进行导出 * */ return new WordImpl(); } }
到此咱们已经实现了一个简单工厂模式,咱们可以很明显的感受到该模式的优点:让对象的调用者与对象建立过程进行分离,当对象调用者须要对象时只需直接向工厂请求便可,
从而避免了对象调用者与对象实现类以硬编码方式进行耦合。就如上面的程序,即便Print接口有不少实现类,咱们只须要到工厂类中进行更换实现类的实例化便可,其余不须要设计
更改,这里也显示了面向接口编程的优点,这样对象的调用者就与接口进行耦合而不是与实现类,与接口耦合的好处就是接口能够有多个实现类,保证了咱们能够不去修改接口,
而只是添加或者修改一个实现类便可;
总结下简单工厂模式:不知道你们有没有发现一个问题就是上面管理实例分配的工厂类中,如今只能每次为其分配一个实例,若是要配置多个实例就须要在工厂类中就行逻辑
判断:
public class PrintFactory { /** * 用于获取print实例的方法 * */ public Print getPrint(Integer param) { if(param == 1) { /** * 这里默认返回的是excel方式进行导出 * */ return new ExcelImpl(); } else if(param == 2) { /** * 更改成使用word方式进行导出 * */ return new WordImpl(); } else { return null; } } }
简单工厂模式的有缺点:
优势:该模式的核心就是工厂类,这个类中含有必要的判断逻辑,能够决定在何时建立哪一个产品类的实例。客户端能够免除直接建立产品对象的责任。
缺点:1.工厂类集中了全部产品建立逻辑,造成一个无所不知的全能类,对于这样的类咱们很难进行控制