设计模式之——工厂方法设计模式

        这个也属于工厂设计模式的一种,上篇设计模式文章我说过,简单工厂设计模式代码有股味道。问题在哪呢???我们发现如果扩展运算的话,首先要创建一个对应的操作类,然后在工厂中加一层判断,那么我们添加功能的时候就违背了“开放-封闭原则”了,因为每次扩展功能都要连珠修改大量代码,耦合度太高了。

        今天就介绍一个他的升级版设计模式,算是比较好的方式了—— 工厂方法设计模式。最大优点就是减少了必要的逻辑判断。

        原理是将创建操作的过程抽象化,有什么操作实现这个接口,可以很好地扩展。工厂方法模式实现时,实际上是将工厂内部的逻辑判断迁移到了客户端,客户端需要决定哪一个工厂来实现运算类,这也是这一种设计模式暴露出的不好的味道。

下面来撸代码:

抽象产品类:用于定义产品都有哪些属性和操作

package com.zndroid.dm.FactoryModel.MethodFactory.opration;

/**
 * Created by luzhenyu on 2016/8/15.
 */
public abstract class Operation {
    protected double numA;
    protected double numB;

    public void setNumA(double numA) {
        this.numA = numA;
    }

    public void setNumB(double numB) {
        this.numB = numB;
    }

    public abstract double getResult();
}
具体产品类:具体实现属性和操作

package com.zndroid.dm.FactoryModel.MethodFactory.opration.impl;


import com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation;

/**
 * Created by luzhenyu on 2016/8/20.
 */
public class AddOpration extends Operation {
    @Override
    public double getResult() {
        return numA + numB;
    }
}
package com.zndroid.dm.FactoryModel.MethodFactory.opration.impl;

import com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation;

/**
 * Created by luzhenyu on 2016/8/22.
 */
public class SubOpration extends Operation {
    @Override
    public double getResult() {
        return numA - numB;
    }
}
抽象工厂类:用于创建对应操作工厂

package com.zndroid.dm.FactoryModel.MethodFactory;


import com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation;

/**
 * Created by luzhenyu on 2016/8/19.
 */
public interface IMethodFactory {

    Operation createOpration();
}
具体工厂类:用于实现创建何种工厂

package com.zndroid.dm.FactoryModel.MethodFactory.implFact;

import com.zndroid.dm.FactoryModel.MethodFactory.IMethodFactory;
import com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation;
import com.zndroid.dm.FactoryModel.MethodFactory.opration.impl.AddOpration;

/**
 * Created by luzhenyu on 2016/8/19.
 */
public class AddFactory implements IMethodFactory {
    @Override
    public Operation createOpration() {
        return new AddOpration();
    }
}
package com.zndroid.dm.FactoryModel.MethodFactory.implFact;

import com.zndroid.dm.FactoryModel.MethodFactory.IMethodFactory;
import com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation;
import com.zndroid.dm.FactoryModel.MethodFactory.opration.impl.SubOpration;

/**
 * Created by luzhenyu on 2016/8/22.
 */
public class SubFactory implements IMethodFactory {
    @Override
    public Operation createOpration() {
        return new SubOpration();
    }
}
具体使用:

 log("----------------我是分割线-----------------");

        IMethodFactory addFactory = new AddFactory();
        com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation addOperation = addFactory.createOpration();
        addOperation.setNumA(444);
        addOperation.setNumB(222);

        log(addOperation.getResult() + "");

        IMethodFactory subFactory = new SubFactory();
        com.zndroid.dm.FactoryModel.MethodFactory.opration.Operation subOperation = subFactory.createOpration();
        subOperation.setNumA(444);
        subOperation.setNumB(222);
        log(subOperation.getResult() + "");

        log("========================================");




【欢迎上码】

【微信公众号搜索 h2o2s2】


猜你喜欢

转载自blog.csdn.net/luzhenyuxfcy/article/details/52251275