大话设计模式读书笔记(一)
2016-07-10 14:47
363 查看
简单的工厂模式
Why
假设,我们需要设计一个计算器以实现加减运算功能。那么,我们当然可以把这个计算器设计成一个class:class Calculator { public int calc(int A, int B, char op) { if (op == '+') { return A + B; } if (op == '-') { return A - B; } }
但是,问题出现了:
Calculator类应该实现两个独立的业务:界面和计算。这里只有一个业务,所以应该命名为Operation
程序没有任何的封装:不管我要加入其它任何的操作,比如乘除法,我都需要看原来的代码,也就是
calcmethod。很多时候已经实现的操作是不能让看到的(比如该方法包含敏感操作或者敏感信息)。
程序缺乏扩展性和灵活性:每次新加入其它操作,所有代码都要重新编译以实现扩展。
为了实现封装和扩展性,我们可以用子类来继承Operation这个抽象类:
public abstract class Operation { private int A; private int B; // ignore getter and setter for A and B public int getResult() { return 0; } }
public class Add extends Operation { @Override public int getResult() { return super.getA() + super.getB(); } }
到此,Java的三大特性基本上都实现了,但是,每当Operation调用的时候,怎么确定是Add还是Subtract被调用了呢?换句话说,到底该实例化哪个class呢?
What
一个工厂是一个class,它可以根据输入来决定实例化哪个它所对应的class。可以把这个class放到客户端让客户端以此来调用相应的方法。注意,客户端不需要知道Operation class的具体实现,但是需要知道Operation class有哪些继承的子类可供调用。How
public class OperationFactory { public static Operation createOperation(char operator) { Operation op = null; switch(operator) { case '+': op = new Add(); break; case '-': op = new Subtract(); break; } return op; } }
Where
这种设计模式其实应用的范围非常广泛,比如,在JDBC里面的sessionfactory。Result
利用工厂来实例化相应的class可以使得应用所需实例化的class数目达到最少从而实现不增加冗余代码和运行负载的功能。相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- 只需十分钟,结果大不同 |《深度思考》
- 《洋葱阅读法》读书笔记
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C# 设计模式系列教程-建造者模式
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解