java设计模式学习笔记之工厂方法模式

java设计模式学习笔记之工厂方法模式

尊重原创,转载请注明出处:http://blog.csdn.net/qq137722697

这是一个使用策略模式构建模式设计的网络请求框架,去看看吧《[倾力之作]android轻量级网络请求框架MyHttputils2.1.6

其实设计模式是有一个单一职责原则和开放封闭原则的。如果你懂这两种方式,你可能就知道简单工厂模式都违背了这两种原则。

开放-封闭原则

是指软件实体(类、模块、方式等等)应该要可以扩展,但是不能修改。

单一职责原则

就一个类而言,应该仅有一个引起它变化的原因(大白话就是功能有一个就可以了)

为什么违背了开放-封闭原则?看工厂类就知道了,当需求增加的时候(比如加一个m的n次幂)就是直接修改工厂类了,可以修改意味着安全性降低,比如不小心修改到其他逻辑代码产生影响等。

单一职责就更好理解了,简单工厂类中有了switch的分支,不是单一的了。

简单工厂模式的升级版——工厂方法模式

下面将继续以计算器案例为demo,Optiner计算器类不变(建议先看这篇《java设计模式学习笔记之计算器中的简单工厂模式》

public class Optioner {
    private int oFirstNum;
    private int oSecondNum;

    public Optioner() {

    }

    public Optioner(int oFirstNum, int oSecondNum) {
        this.oFirstNum = oFirstNum;
        this.oSecondNum = oSecondNum;
    }

    public int getResult() {
        return 0;
    }

    //省略get、set方法
}

将运算方法抽取为一个运算类的接口

/**
 * 运算工厂接口类
 * Created by HDL on 2016/12/2.
 */
public interface IOperationFactory {
    Optioner createOperation();//创建运算
}

有一个加法运算

/**加法运算
 * Created by HDL on 2016/12/2.
 */
public class AddOptioner extends Optioner{
    @Override
    public int getResult() {
        return getoFirstNum()+getoSecondNum();
    }
}

对应一个加法运算类的工厂类

/**
 * 加法运算工厂
 * Created by HDL on 2016/12/2.
 */
public class AddOperationFactory implements IOperationFactory {
    @Override
    public Optioner createOperation() {
        return new AddOptioner();
    }
}

使用

public static void main(String[] args) {
    Optioner optioner = new AddOperationFactory().createOperation();
    optioner.setoFirstNum(33);
    optioner.setoSecondNum(33);
    System.out.println("结果为:"+optioner.getResult());
}

结果:
这里写图片描述

某一天需求改变了,让加一个减法的功能,这就好办了,只需要加一个减法运算类和减法运算工厂类即可。

/**
 * 减法运算
 * Created by HDL on 2016/12/2.
 */
public class SubOptioner extends Optioner {
    @Override
    public int getResult() {
        return getoFirstNum() - getoSecondNum();
    }
}
/**
 * 减法工厂
 * Created by HDL on 2016/12/2.
 */
public class SubOperationFactory implements IOperationFactory {
    @Override
    public Optioner createOperation() {
        return new SubOptioner();
    }
}

用法:

public static void main(String[] args) {
    Optioner optioner = new SubOperationFactory().createOperation();
    optioner.setoFirstNum(33);
    optioner.setoSecondNum(31);
    System.out.println("结果为:"+optioner.getResult());
}

结果:
这里写图片描述

是不是相对好多了?可扩展性非常强、耦合度低,但是觉得不好的就是类增加太多了,但是为高性能的代码这点付出还是值得的,还有一方面就是选择条件又变到客户端了,怎么说?就是说要实现什么功能还是要由客户端来实例化的。(其实后面还有优化的方式,即通过反射的方式,后面陆续退出相关文章)

简单工厂与工厂方法的比较

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,去除了与具体产品的依赖。

最后

再来说说工厂方法模式

工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。(由子类来决定需要实例化哪个)

尊重原创,转载请注明出处:http://blog.csdn.net/qq137722697

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值