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

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

还是以代码来进行比較吧

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. 二叉树中序遍历 (C语言实现)

    在计算机科学中,树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构.二叉树是每个节点最多有两个子树的有序树.通常子树被称作“左子树”(left subtre ...

  2. Tweet button with a callback – How to?

    原文: http://jaspreetchahal.org/tweet-button-with-a-callback-how-to/ 两种方式:1. 原生的button <a href=&quo ...

  3. connect network is unreachable 解决办法

    详细教程见:http://blog.csdn.net/liukun321/article/details/6662950 1.虚拟机中的centos系统要连接外网,我们需要使用桥接网络 2.正常配置e ...

  4. php中文件引入require

    ./ 表示当前层 ../表示向上一层 php中好像不能像asp那样,用 “/” 表示根目录,但可以用$_SERVER['DOCUMENT_ROOT'] 表示网站根目录 引用分为三种: 上级对下级的引用 ...

  5. 日期选择器(Query+bootstrap和js两种方式)

    日期选择是在下拉列表中选择年.月.日,年显示前后的五年,12个月,日就是有30.31.29.28天的区别,随着月份的变而变 一.js方式的日期选择 (1)首先就是三个下拉列表了,点击年.月.日显示列表 ...

  6. codevs 4768 跳石头

    传送门 表示去年不会,二分是啥都不知道,一脸懵逼. 今年再做,虽然知道二分是啥了,但依旧不会,蒙蔽了好几天,最后还是看了题解. #include<cstdio> #define M 510 ...

  7. Java中String、StringBuffer、StringBuilder和toString的介绍

    作为一个刚接触java的小白,觉得字符串是个比较大的知识点,所以我把自己整理的一点笔记写成随笔,与园友一起分享,也请园友多多指出意见. 一.String类 1.字符串长度——length() Stri ...

  8. Nhibernate 分页

    public IList<Student> GetStudentByPage(int pageSize, int pageIndex, string SName) { ISession s ...

  9. maven学习心得

    心得:这几天一直在研究maven的配置,还真是伤心啊,网上资料不多,而且问题不断.确实很让人头疼 背景:之所以学习maven是因为我们需要一键部署,我们项目是已经差不多完成了,是eclipse的web ...

  10. 转:windows xp下如何安装SQL server2000企业版

    SQL2000企业版本 适用于WIN 2000 Server系统和Windows 2003系统,Windows XP一般装不了需要选用个人版或开发板.但是企业版也可以安装在xp系统下.这里介绍一个XP ...