工厂模式

来源:互联网 发布:java初学者源代码 编辑:程序博客网 时间:2024/06/07 00:56

转载自:
http://www.cnblogs.com/zhouqiang/archive/2012/07/20/2601365.html
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。
工厂模式的形态
工厂模式主要用一下几种形态:
1:简单工厂(Simple Factory)。
2:工厂方法(Factory Method)。
3:抽象工厂(Abstract Factory)。

简单工厂(Simple Factory)
又叫静态工厂,是工厂模式三中状态中结构最为简单的。主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例。我们来看一个具体的例子:
假设一家工厂,几生产洗衣机,有生产冰箱,还有空调等等..
我们先为所有产品定义一个共同的产品接口
public interface Product{}

接着我们让这个工厂的所有产品都必须实现此接口
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(“空调被制造了”);
}
}

接下来我们来写一个工厂类,有它来负责生产以上的产品
public class SimpleFactory {

public static Product factory(String productName) throws Exception{     if(productName.equals("Washer")){         return new Washer();     }else if(productName.equals("Icebox")){         return new Icebox();     }else if(productName.equals("AirCondition")){         return new AirCondition();     }else{         throw new Exception("没有该产品");     } } 

}

好了,有了这个工厂类,我们就可以开始下定单了,SimpleFactory将根据不同的定单类决定生产什么产品。
public static void main(String[] args) {
try {
SimpleFactory.factory(“Washer”);
SimpleFactory.factory(“Icebox”);
SimpleFactory.factory(“AirCondition”);
} catch (Exception e) {
e.printStackTrace();
}
}

由上面的代码可以看出,简单工厂的核心就是一个SimpleFactory类,他拥有必要的逻辑判断能力和所有产品的创建权利,我们只需要向把定单给他,就能得到我们想要的产品。这使用起来似乎非常方便。
但,实际上,这个SimpleFactory有很多的局限。首先,我们每次想要增加一种新产品的时候,都必须修改SimpleFactory的原代码。其次,当我们拥有很多很多产品的时候,而且产品之间又存在复杂的层次关系的时候,这个类必须拥有复杂的逻辑判断能力,其代码量也将不断地激增,这对以后的维护简直就是恐怖两个字…
还有就是,整个系统都严重依赖SimpleFactory类,只要SimpleFactory类一出问题,系统就进入不能工作的状态,这也是最为致命的一点….
以上的不足将在工厂模式的另外两种状态中得到解决。

工厂方法(Factory Method)
上面的代码告诉我们,简单工厂并不简单,它是整个模式的核心,一旦他出了问题,整个模式都将受影响而不能工作,为了降低风险和为日后的维护、扩展做准备,我们需要对它进行重构,引入工厂方法。
工厂方法为工厂类定义了接口,用多态来削弱了工厂类的职能,以下是工厂接口的定义:
public interface Factory{
public Product create();
}

我们再来定义一个产品接口
public interface Product{}

一下是实现了产品接口的产品类
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(“空调被制造了”);
}
}

接下来,就是工厂方法的核心部分,也就是具体创建产品对象的具体工厂类,
//创建洗衣机的工厂
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();
}
}

从上面创建产品对象的代码可以看出,工厂方法和简单工厂的主要区别是,简单工厂是把创建产品的职能都放在一个类里面,而工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面,这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。但工厂方法也有他局限的地方,那就是当面对的产品有复杂的等级结构的时候,例如,工厂除了生产家电外产品,还生产手机产品,这样一来家电是手机就是两大产品家族了,这两大家族下面包含了数量众多的产品,每个产品又有多个型号,这样就形成了一个复杂的产品树了。如果用工厂方法来设计这个产品家族系统,就必须为每个型号的产品创建一个对应的工厂类,当有数百种甚至上千种产品的时候,也必须要有对应的上百成千个工厂类,这就出现了传说的类爆炸,对于以后的维护来说,简直就是一场灾难…..

抽象工厂(Factory Method)
抽象工厂:意的意图在于创建一系列互相关联或互相依赖的对象。<

1 0