工厂方法模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂方法模式相关的知识,希望对你有一定的参考价值。

开放-封闭原则:

在设计模式中,对于不能修改,但可以扩展的思想也是一种重要的设计原则。比如国家对于香港的一国两制。大陆的社会主义是不可以更改的,但由于香港长期处于资本主义下,强制执行社会主义难免有些牵强,所以邓小平同志就用了开放-封闭原则,完美的解决了这一问题。在前期进行软件设计的时候,应该做好后期新增需求的准备。尽量做到新增需求时,不需要更改已有代码,而是新增代码,进行需求的扩展。

工厂方法模式:

问题抛出:在上一篇文章中,通过一个简单的两位数计算介绍了简单工厂模式。在这基础上,试想如果我们需要增加一种算法,输入两个数m、n,计算m的n次方。如果在简单工厂模式的基础上修改,那么有两步:

1> 新增算法实现类OperationFac.

2> 修改工厂类Factory,将阶乘判断逻辑添加上。

通过上面的步骤,实现了我们的需求。但是,如果细想,这违背了我们的开放-封闭原则,更改了Factory。

这里,就该工厂方法模式登场了。

工厂方法模式:定义一个用于创建对象的接口,让其子类决定实例化哪一类。工厂方法使一个类的实例化延迟到了其子类。

通过工厂模式实现上面需求:

1> 新增OperationFac运算类

package factorytest;

/**
 *
 * @author 阿正
 */
public class OperationFac extends Operation{

    @Override
    public double getResult() {
        double result = 1;
        for(int i = 0;i < numberB;i++){
            result *=numberA;
        }
        return result;
    }
    
}

2> 定义创建对象工厂接口

package factorytest;

/**
 *
 * @author 阿正
 */
interface Factory {
    Operation getOperation();
}

3> 创建工厂子类,实现工厂接口

package factorytest;

/**
 *
 * @author 阿正
 */
public class FacFactory implements Factory{

    @Override
    public Operation getOperation() {
        return new OperationFac();
    }
    
}

4> 修改客户端

package factorytest;

/**
 *
 * @author 阿正
 */
public class FactoryTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Operation oper = new FacFactory().getOperation();
        oper.numberA = 2;
        oper.numberB = 5;
        double result = oper.getResult();
        System.out.println(result);
    }
    
}

ok,搞定。

工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。

以上是关于工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-简单工厂工厂方法模式抽象工厂模式详解

工厂方法模式

设计模式-工厂方法模式(Go实现)

C++工厂模式(简单工厂工厂方法抽象工厂)

C++工厂模式(简单工厂工厂方法抽象工厂)

设计模式---工厂模式