怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错。此工厂模式非彼工厂模式。

工厂模式:定义一个用于创建对象的接口。让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到其子类。

还是以代码来进行比較吧

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。

附上源码:http://download.csdn.net/detail/jzhf2012/8095101

<五>读《《大话设计模式》》之工厂模式的更多相关文章

  1. 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#

    负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...

  2. 大话设计模式之工厂模式 C#

    学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 大话设计模式一书中第一个开讲的设计模式是简单工厂模式,关于简单工厂模式大家可参考鄙人的博客:代 ...

  3. 大话设计模式--抽象工厂模式 Abstract Factory -- C++实现实例

    1. 抽象工厂模式: 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类. 下面是工厂方法模式: 下面是抽象工厂模式: 和工厂方法模式相比 抽象工厂模式可以有多个Product抽象, ...

  4. linkin大话设计模式--抽象工厂

    linkin大话设计模式--抽象工厂 在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了  现在要是还想彻底解耦的话怎么办呢 ...

  5. C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone

    C# Json反序列化   Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...

  6. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  7. C#学习之设计模式:工厂模式

    最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...

  8. 设计模式之工厂模式(c++)

    问题描述 在面向对象系统设计中经常可以遇到以下的两类问题:1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口.这样我们可以通过声明 ...

  9. js设计模式:工厂模式、构造函数模式、原型模式、混合模式

    一.js面向对象程序 var o1 = new Object();     o1.name = "宾宾";     o1.sex = "男";     o1.a ...

  10. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

随机推荐

  1. java编程思想-注解思维导图

  2. break、continue和goto 三者作用介绍

    跳跃语句 由于break.continue和goto语句有助于跳跃到代码中的某个特定语句,因此它们属于跳跃语句.下面是这三个语句的介绍. ①break语句 这个语句常与switch语句联合使用:但是, ...

  3. Kill Processes in Linux

    Step 1: find processes to kill ps -ef | grep java Step 2: Kill the process based on process id kill ...

  4. ASP.NET菜鸟之路之Response小例子

    背景 我是一个ASP.NET菜鸟,暂时开始学习ASP.NET,在此记录下我个人敲的代码,没有多少参考价值,请看到的盆友们为我点个赞支持我一下,多谢了. Response.Write Redirect ...

  5. POJ3658Matrix( 双重二分+负数+死循环)

    POJ 3658 Matrix 双重二分,wa了一下午,实在不太明白为啥一写二分就会进入死循环. INF要设的大一些,本题设0x3f3f3f3f会wa. 本题有负数, 二分时(l+r)/2与(l+r) ...

  6. 深入浅出理解QTimeLine类

    网上找了下QTimeLIne类的介绍,要么就是代码一贴自己看去,要么就是说不到重点,正巧自己项目遇到这个类,在这里写一下,给需要的同学看下. 因为我最近需要有动画方面配合时间间隔触发QGraphics ...

  7. NetBeans无法使用编码GBK安全地打开该文件 解决方法

    正常安装的NetBeans在打开UTF-8编码的文件时,会提示“NetBeans无法使用编码GBK安全地打开该文件”,点击“是”强制打开后,中文会变成乱码. 上述问题可以通过如下方式解决: 用文本编辑 ...

  8. windows下Django 部署到Apache24的配置

    1.首先下载最新版Apachehttp://httpd.apache.org/download.cgi#apache24,目前官方以不提供windows msi安装包,下载好的直接解压至C盘即可,ap ...

  9. PHP之路——MySql基础操作语句

    1,创建数据库,create datebase 数据库名,在这里kenan建立一个数据库名为myfirstdb create database myfirstdb; 2,查看所有的数据库 show d ...

  10. Java文件末尾追加字符串

    Java进行文件输出时,有时候想直接向已有文件末尾追加字符,而不是从头开始写,可以采用以下三种方式实现: package test; import java.io.File; import java. ...