二、工厂模式
1.介绍
在上一节中介绍了“简单工厂模式”,现在来介绍下“工厂模式”,在“工厂模式”和“简单工厂模式”中,最主要,最明显的区别之一是“工厂模式”下可以设立多个子工厂,而不是所有的产品有单一的工厂来生产,而是给各自特色的子工厂来生产。
2.例子
我们还是继续使用“计算器”来作为例子吧。由于在产品Product的结构模式变化不大,所以就不在载入(详情看“简单工厂模式”的随笔),主要载入“工厂模式”的代码
a.父工厂接口(IFactory接口)
import SimpleFactory.Operation;
public interface IFactory {
public Operation createOperation();
}
b.子工厂(加法工厂,减法工厂,乘法工厂,除法工厂)
import SimpleFactory.Operation;
import SimpleFactory.OperationAdd;
import SimpleFactory.OperationSub;
import SimpleFactory.OperationMul;
import SimpleFactory.OperationDiv;
public class AddFactory implements IFactory{
public Operation createOperation() {
// TODO Auto-generated method stub
return new OperationAdd();
}
}
public class SubFactory implements IFactory{
@Override
public Operation createOperation() {
// TODO Auto-generated method stub
return new OperationSub();
}
}
public class MulFactory implements IFactory{
@Override
public Operation createOperation() {
// TODO Auto-generated method stub
return new OperationMul();
}
}
public class DivFactory implements IFactory{
@Override
public Operation createOperation() {
// TODO Auto-generated method stub
return new OperationDiv();
}
}
c.客户端
import SimpleFactory.Operation; public class Client { public static void main(String[] args) { IFactory operFactory = new AddFactory(); Operation oper = operFactory.createOperation(); oper.set_numberA(1); oper.set_numberB(2); double result = oper.getResult(); System.out.println(result); } }
d.UML图(例子是从《大话设计模式》中借鉴而来的,这是一本很不错的书)

3.评价:
a.在客户端Client中可以将工厂模式的主要结构看着很清楚,首先我们要有IFactory这个工厂的父接口,所有的子类或者子接口都可以实现它。AddFactory则是子类的代表之一,所以利用java的多态来实现,降低代码的耦合性。而同时每个子工厂中拥有每条生产独特产品的生产线。由此,工厂和产品挂上钩了,联系上了。每个子工厂生产出来的都是独特的产品。
b.比“简单工厂模式”的优缺点
优点:克服了简单工厂违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性,所以说“工厂模式”是“简单工厂模式”的进一步抽象和推广。
缺点:每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。