<五>读《《大话设计模式》》之工厂模式
2016-03-07 18:42
393 查看
怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错。此工厂模式非彼工厂模式。
工厂模式:定义一个用于创建对象的接口。让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到其子类。
还是以代码来进行比較吧
1、操作接口。与简单工厂模式一样
publicabstractclass Operation {
publicdoublenumberA;
publicdoublenumberB;
publicabstractdouble getResult();
}
2、相加、相减类与简单工厂模式一样
publicclass OperationAddextends Operation{
publicdouble getResult(){
returnnumberA +numberB;
}
}
publicclass OperationSubextends Operation{
publicdouble getResult(){
returnnumberA -numberB;
}
}
3、多了一个工厂接口
publicinterface IFactory {
OperationcreateOperation();
}
4、给每一个算法都建立一个工厂,有了这个工厂之后,每一个算法实例都分离开来,遵循了开闭原则。使代码结构更加清晰
给加法、减法一个工厂
publicclass AddFactoryimplements IFactory {
public Operation createOperation() {
//TODO Auto-generated method stub
returnnew OperationAdd();
}
}
publicclass SubFactoryimplements IFactory {
public Operation createOperation() {
//TODO Auto-generated method stub
returnnew OperationSub();
}
}
5有了这些工厂之后直接在client实例化想要的算法类就能够了(缺点耦合性差)
publicclass FatoryClient {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
//TODO Auto-generated method stub
IFactoryfactory =
new AddFactory();
Operationoperation = factory.createOperation();
operation.numberA = 3;
operation.numberB = 2;
double result = operation.getResult();
System.out.println("相加结果:"+result);
//我想调用还有一个实例。只在此newSubFactory()改动一下就能够了
IFactoryfactory2 =
new SubFactory();
Operationoperation2 = factory2.createOperation();
operation2.numberA = 3;
operation2.numberB = 2;
double result2 = operation2.getResult();
System.out.println("相减结果:"+result2);
}
}
与简单工厂模式比較
比方我们要加一个算法:M的N次方,在简单工厂里面。我们先去加“M的N次方”功能类。然后去更改工厂方法,其中加case来推断调用。工厂模式呢,我们须要加“M的N次方”功能类,还要加该功能的工厂类,而且还要改client。看似麻烦了。事实上不然,简单工厂最大的长处是工厂类中包括了必要的逻辑推断。依据client的选择条件动态的实例化相关的类。对于client来说。去除了与详细产品的依赖。而工厂模式遵循了开闭原则。我加入业务需求不用改动原来的类的逻辑。直接加入新的逻辑就能够了。
最后附上工厂模式类图:
总结:工厂方法模式实现时,client须要决定实例化哪一个工厂来实现运算类,选择推断的问题还是存在的,也就是说。工厂方法把简单工厂的内部逻辑推断移到了client代码来实现,你想加功能,本来是改工厂类的,而如今改动client。
附上源码:http://download.csdn.net/detail/jzhf2012/8095101
相关文章推荐
- IIS部署WCF网站服务步骤
- session cookie
- Bootstrap整合ASP.NET MVC验证、jquery.validate.unobtrusive
- Java线程学习-创建线程,线程的简单实用
- 设计模式之迭代器模式
- YTU 2417: C语言习题 字符串长度
- proxy-target-class="true" 与proxy-target-class="false"的区别
- Pro Git——Git 内部原理
- 课后作业
- Unity3D之Web Player与unity的互相传值交互
- Python django学习
- jasmine学习
- Pro Git——Git 与其他系统
- 简单太阳系制作
- JavaScript数据类型
- web开发漫谈
- linux(ubuntu)myeclipse+eclipse+hadoop系统搭建(二)
- YTU 1068: 复制字符串
- 平衡二叉树(AVL树)
- Android 热修复 HotFix 混淆apk生成patch包方案