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

来源:互联网 发布:怎样领取淘宝优惠券 编辑:程序博客网 时间:2024/06/06 15:37

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

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

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

下面来撸代码:

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

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("========================================");





0 0