设计模式主要分三个类型:创建型、结构型和行为型。
工厂模式属于创建型的设计模式
工厂模式主要是为创建对象提供过渡接口,以便创建对象具体过程屏蔽隔离起来,达到提高灵活性的目的。
其中工厂模式又分为三类
1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。
GOF在《设计模式》一书中讲工厂模式分为两类:工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory),
将简单工厂模式(Simple Factory)看做工厂方法模式(Factory Method)的一种特例,两者归为一类。
下面我们来介绍下简单工厂模式(Simple Factory)
简单工厂模式又称作静态工厂方法模式。重命名上就可以看出这种模式一定很简单,它存在的目的很简单:定义一个用户创建对象的接口。
先看看它的组成
1)工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
2)抽象产品角色:它一般是由具体产品继承的父类或者实现的接口。在java中它往往由一个抽象类或者接口实现。
3)具体产品角色:工厂类所创建的对象就是此角色的实例。在java中它往往由一个具体类实现。
抽象产品角色(我们定义了一个打印机)
- public interface Printer
- {
- public void out();
- public void getData(String msg);
- }
具体产品角色(我们定义两个产品,一个是普通打印机,一个是高速打印机)
- /**
- * 普通打印机
- */
- public class CommonPrinter implements Printer
- {
- private final int MAX_CACHE_LINE = 10;
- private String[] printData = new String[MAX_CACHE_LINE];
- private int dataNum = 0;
- public void getData(String msg)
- {
- if(dataNum >= MAX_CACHE_LINE)
- {
- System.out.println("输出队列已满,添加失败");
- }
- else
- {
- printData[dataNum++] = msg;
- }
- }
- public void out()
- {
- while(dataNum>0)
- {
- System.out.println("普通打印机打印: "+printData[0]);
- System.arraycopy(printData,1,printData,0,--dataNum);
- }
- }
- }
- /**
- * 高速打印机
- */
- public class BetterPrinter implements Printer
- {
- private final int MAX_CACHE_LINE = 10;
- private String[] printData = new String[MAX_CACHE_LINE * 2];
- private int dataNum = 0;
- public void getData(String msg)
- {
- if(dataNum >= MAX_CACHE_LINE * 2)
- {
- System.out.println("输出队列已满,添加失败");
- }
- else
- {
- printData[dataNum++] = msg;
- }
- }
- public void out()
- {
- while(dataNum>0)
- {
- System.out.println("高速打印机打印: "+printData[0]);
- System.arraycopy(printData,1,printData,0,--dataNum);
- }
- }
- }
最后是测试了,我们定义一台计算机,由它调用工厂去生产我们需要的打印机。需要什么类型的打印机,就给工厂传入对应的类型,由工厂返回我们需要的打印机。
- public class Computer
- {
- private Printer out;
- public Computer(Printer out)
- {
- this.out = out;
- }
- public void keyIn(String msg)
- {
- out.getData(msg);
- }
- public void print()
- {
- out.out();
- }
- public static void main(String[] args)
- {
- PrinterFactory of = new PrinterFactory();
- Computer c = new Computer(of.getPrinter("common"));
- c.keyIn("hello");
- c.keyIn("world");
- c.print();
- }
- }
打印结果:
普通打印机打印: hello
普通打印机打印: world
这便是简单工厂模式了,怎么样使用起来简单吧,那么它带来了什么好处呢?
首先使用了简单工厂模式后,我们的程序不在“有病”,更加符合现实中的情况,而且客户端避免除了直接创建产品对象的责任,而仅仅负责“消费”产品