<五>读《《大话设计模式》》之工厂模式
怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错。此工厂模式非彼工厂模式。
工厂模式:定义一个用于创建对象的接口。让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到其子类。
还是以代码来进行比較吧
1、操作接口。与简单工厂模式一样
publicabstractclass Operation {
publicdoublenumberA;
publicdoublenumberB;
publicabstractdouble getResult();
}
、相加、相减类与简单工厂模式一样
publicclass OperationAddextends Operation{
publicdouble getResult(){
returnnumberA +numberB;
}
}
publicclass OperationSubextends Operation{
publicdouble getResult(){
returnnumberA -numberB;
}
}
、多了一个工厂接口
publicinterface IFactory {
OperationcreateOperation();
}
、给每一个算法都建立一个工厂,有了这个工厂之后,每一个算法实例都分离开来,遵循了开闭原则。使代码结构更加清晰
给加法、减法一个工厂
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();
}
}
有了这些工厂之后直接在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来说。去除了与详细产品的依赖。而工厂模式遵循了开闭原则。我加入业务需求不用改动原来的类的逻辑。直接加入新的逻辑就能够了。
最后附上工厂模式类图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanpoZjIwMTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
总结:工厂方法模式实现时,client须要决定实例化哪一个工厂来实现运算类,选择推断的问题还是存在的,也就是说。工厂方法把简单工厂的内部逻辑推断移到了client代码来实现,你想加功能,本来是改工厂类的,而如今改动client。
<五>读《《大话设计模式》》之工厂模式的更多相关文章
- 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#
负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...
- 大话设计模式之工厂模式 C#
学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 大话设计模式一书中第一个开讲的设计模式是简单工厂模式,关于简单工厂模式大家可参考鄙人的博客:代 ...
- 大话设计模式--抽象工厂模式 Abstract Factory -- C++实现实例
1. 抽象工厂模式: 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类. 下面是工厂方法模式: 下面是抽象工厂模式: 和工厂方法模式相比 抽象工厂模式可以有多个Product抽象, ...
- linkin大话设计模式--抽象工厂
linkin大话设计模式--抽象工厂 在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了 现在要是还想彻底解耦的话怎么办呢 ...
- C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone
C# Json反序列化 Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
- C#学习之设计模式:工厂模式
最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...
- 设计模式之工厂模式(c++)
问题描述 在面向对象系统设计中经常可以遇到以下的两类问题:1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口.这样我们可以通过声明 ...
- js设计模式:工厂模式、构造函数模式、原型模式、混合模式
一.js面向对象程序 var o1 = new Object(); o1.name = "宾宾"; o1.sex = "男"; o1.a ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
随机推荐
- 关于iframe调用父页面元素操作
在iframe子页面获取父页面元素 代码如下: //在iframe子页面获取父页面元素 $.('#objld', parent.document); //在父页面获取iframe子页面的元素 $(&q ...
- (转)如何将ecshop首页主广告位的flash轮播替换为js轮播
转之--http://www.ecshoptemplate.com/article-1710.html 这个ecshop很常见,因为现在比起flash难以修改,js更加符合人们的使用习惯,而默认ecs ...
- 开源的Android开发框架-------PowerFramework使用心得(二)图片异步加载ImageTask
图片异步加载.可以备注图片是否缓存.缓存状态. 1.缓存-SD卡,路径可设置 2.图片压缩 3.可加载本地和网络图片 4.url为本地视频文件可以显示缩略图 5.中文url图片地址FileNotFou ...
- AutoLayout适配
http://www.raywenderlich.com/113768/adaptive-layout-tutorial-in-ios-9-getting-started iOS布局和屏幕适配的一点总 ...
- 关于margin-top失效的解决方法
常出现两种情况:(一)margin-top失效 先看下面代码: <div><div class="box1" >float:left</div> ...
- php 文件操作之抓取网站图片
$str= file_get_contents("http://v.qq.com/");preg_match_all("/\<img\s+src=.*\s*\> ...
- 下拉菜单选择(jQuery实现)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- C# ,asp.net 获取当前,相对,绝对路径(转)
C# ,asp.net 获取当前,相对,绝对路径 一.C#获取当前路径的方法: . System.Diagnostics.Process.GetCurrentProcess().MainModule. ...
- 离线安装maven
maven离线安装 1.在eclipse根目录下新建两个文件夹,links和myplugins,myplugins文件名可以自定义 2.下载maven http://pan.baidu.com/s/1 ...
- php解析json数据
<?php $data; $data.="["; for ($i=0;$i<20;$i++) { $data.="{"; $data.=" ...