赞
踩
在现实生活中社会分工越来越细,越来越专业化。各种产品有专门的工厂生产,彻底告别了自给自足的小农经济时代,这大大缩短了产品的生产周期,提高了生产效率。同样,在软件开发中能否做到软件对象的生产和使用相分离呢?能否在满足“开闭原则”的前提下,客户随意增删或改变对软件相关对象的使用呢?这就是本节要讨论的问题。
在简单工厂模式中,我们提到了简单工厂模式违背了开闭原则,而“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。
它的核心结构有四个角色:
工厂方法经常用在以下两种情况中:
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
延续简单工厂模式的计算器控制台程序,要求输入两个数和运算符号,得到结果。

/**
* 工厂接口
*
*/
public interface IFactory {
public Operation createOperation();
}
class AddFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationAdd();
}
}
class SubFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationSub();
}
}
class MulFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationMul();
}
}
class DivFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationDiv();
}
}
/**
* 操作类抽象类
*
*/
public abstract class Operation {
public double numberA;
public double numberB;
public abstract double result();
}
/**
* 加法类
*
*/
public class OperationAdd extends Operation {
@Override
public double result() {
return numberA + numberB;
}
}
/**
* 除法类
*
*/
public class OperationDiv extends Operation {
@Override
public double result() {
if (numberB == 0) {
throw new RuntimeException("divided by 0");
}
return numberA / numberB;
}
}
/**
* 乘法类
*
*/
public class OperationMul extends Operation {
@Override
public double result() {
return numberA * numberB;
}
}
/**
* 减法类
*
*/
public class OperationSub extends Operation {
@Override
public double result() {
return numberA - numberB;
}
}
/**
* 工厂方法客户端
*
*/
public class FactoryClient {
public static void main(String[] args) {
IFactory operFactory = new DivFactory();
Operation operation = operFactory.createOperation();
operation.numberA = 3.4;
operation.numberB = 4.5;
System.out.println(operation.result());
}
}
优点:
缺点:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。