工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以在使用new实例化对象时,可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
工厂模式使用条件应该是针对实例化有共同接口的类,实例化过程中可以动态决定应该实例化那一个类。
针对Java设计模式的工厂模式,它有三种设计方式: 简单工厂模式(Simple Factory) 、工厂方法模式(Factory Method) 和抽象工厂模式(Abstract Factory)。
一、 简单工厂模式(Simple Factory)
对于存在有统一接口(Interface)的不同类(class)使用公共类的静态方法创建实例,这个静态方法,用来接受类名称的参数,并根据类名称来决定返回实现同一接口的不同类的实例,这种模式也称为静态模式。
简单工厂模式的搭建过程如下:
- 定义不同类的统一接口。
- 分别定义具有统一接口的各个不相同的类。
- 定义一个公共类的静态方法用来创建具有统一接口的不同类的实例。
实际上,这种SimpleFactory有很多的局限。首先,我们每次想要增加一种新产品的时候,都必须修改SimpleFactory的源代码。其次,当我们拥有很多很多产品,而且产品之间又存在复杂的层次关系的时候,这个类必须拥有复杂的逻辑判断能力,其代码量也将不断地激增。简单工厂模式(Simple Factory)的不足将在工厂模式的另外两种设计方式中得到解决。
二、工厂方法模式(Factory Method)
在简单工厂模式中,定义一个公共类的静态方法时,需要很强的逻辑性,而且层次也不容易分明。把一个公共类的静态方法分化为统一的接口方法,实现这个接口的每个类都可以自由地决定它们自己的实现细节和实现逻辑,这就完全利用了多态机制的“一个接口,多种方法”的特征。使用这种特征的模式就是工厂方法模式。
工厂方法模式的搭建过程如下(归纳起来,不容易理解,还是借鉴一个例子吧!引用自:http://chjl2020.iteye.com/blog/265283):
假设一家工厂,既生产洗衣机,又生产冰箱,还有空调等等..
1、工厂方法为工厂类定义了接口,用多态来削弱了工厂类的职能,以下是工厂接口的定义:
public interface Factory{ //工厂类接口 public Product create(); //创建产品实例的方法 }
2、定义一个产品接口
public interface Product{}
3、实现了产品接口的产品类
public class Washer implements Product{ public Washer(){ System.out.println("洗衣机被制造了"); } } public class Icebox implements Product{ public Icebox(){ System.out.println("冰箱被制造了"); } } public class AirCondition implements Product{ public Icebox(){ System.out.println("空调被制造了"); } }
4、创建产品对象的具体工厂类
//创建洗衣机的工厂 public class CreateWasher implements Factory{ public Product create(){ return new Washer(); } } //创建冰箱的工厂 public class CreateIcebox implements Factory{ public Product create(){ return new Icebox(); } } //创建空调的工厂 public class CreateAirCondition implements Factory{ public Product create(){ return new AirCondition(); } }
工厂方法和简单工厂的主要区别是,简单工厂是把创建产品的职能都放在一个类里面,而工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面,这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。
三、抽象工厂模式(Abstract Factory)
抽象工厂模式意图在于创建一系列互相关联或互相依赖的对象。