说道设计模式,最先讲到的设计模式必然是工厂系列的设计模式。下面我们就来看下工厂系列设计模式:

简单工厂模式

简单工厂模式严格来说都不是一种设计模式,只是工厂方法模式的一个简单实现,但是我们平时运用最多就是这个简单工厂模式。

简单工厂模式通常用在固定且不大会改变的类族的创建。举个简单的例子,我们现在有个生化实验室来克隆人,所以我们要有一个人的模具

人是一个父类:

public class Ren {}

Ren这个父类有两个子类:男人和女人

public class NanRen extends Ren {}

public class NvRen extends Ren {}

所以我们可以有一个人工厂来分别造出男人和女人(具体怎么造请自行想象,我只是一个宅男程序猿,不是H文作者)。

class RenFactory {public Ren createRen(String gender) {Ren r = null;if (gender == "male") {r = new NanRen();} else if (gender == "female") {r = new NvRen();}return r;}
}

这是我们的实验室就能很轻松的制造出男人或者女人了

public class Laboratory {public static void main(String[] args) {RenFactory rf = new RenFactory();Ren nan = rf.createRen("male");Ren nv = rf.createRen("female");}
}

上面就是一个简单工厂模式的简单例子。以下是具体全部代码

View Code

class Ren {}class NanRen extends Ren {}class NvRen extends Ren {}class RenFactory {public Ren createRen(String gender) {Ren r = null;if (gender == "male") {r = new NanRen();} else if (gender == "female") {r = new NvRen();}return r;}
}public class Laboratory {public static void main(String[] args) {RenFactory rf = new RenFactory();Ren nan = rf.createRen("male");Ren nv = rf.createRen("female");}
}

工厂方法模式

上面说到了简单工厂方法,下面我们继续我们的例子来说明工厂方法模式。

现在我们的实验室不仅仅要男人和女人,我们还兼并了泰国的某个不知名实验室,我们还生产人妖,所以我们要安装新的人妖生产线,还需要更新我们的工厂系统。以下是我们的一个更新方案。

class RenYao extends Ren {}
class RenFactory {public Ren createRen(String gender) {Ren r = null;if (gender == "male") {r = new NanRen();} else if (gender == "female") {r = new NvRen();} else if (gender == "renyao") {r = new RenYao();}return r;}
}public class Laboratory {public static void main(String[] args) {RenFactory rf = new RenFactory();Ren nan = rf.createRen("male");Ren nv = rf.createRen("female");Ren ry = rf.createRen("renyao");    }}

但是此时我们的资深顾问提出了不同意见,现在我们兼并泰国的实验室,我们需要一个人妖的生产线可以从泰国实验室直接拿来用,但是我们的工厂系统却也要更改,万一那一部分错误,我们以前能制造的男人和女人也会出问题阿。况且听说上层正在谈收购太阳实验室的事情,那么到时候我们岂不是又得更新我们的工厂系统了! 我们何不再多造几个工厂来造不同的人,于是我们实验室又提出了以下的方案:

创建一个工厂的样板间以便其他工厂有个参照物

interface Factory {public abstract Ren createRen(String gender);
}

保留我们以前生产正常人的工厂

class RenFactory implements Factory{public Ren createRen(String gender) {Ren r = null;if (gender == "male") {r = new NanRen();} else if (gender == "female") {r = new NvRen();}return r;}
}

再新建一座可以生产人妖的人妖工厂

class RenYaoFactory implements Factory{public Ren createRen(String gender) {Ren r = new RenYao(); //人妖是不在乎性别的return r;}
}

所以当我们实验室就可以很顺利的经行生产了

public class Laboratory {public static void main(String[] args) {Factory rf = new RenFactory();Ren nan = rf.createRen("male");Ren nv = rf.createRen("female");Factory ryf = new RenYaoFactory();Ren ry = ryf.createRen(null);}
}

并且在一段时候后我们实验室成功兼并了太阳实验室,并在太阳当地设置了我们的兽人工厂。

View Code

class Ren {}class NanRen extends Ren {}class NvRen extends Ren {}class RenYao extends Ren {}class ShouRen extends Ren {}interface Factory {public abstract Ren createRen(String gender);
}class RenFactory implements Factory {public Ren createRen(String gender) {Ren r = null;if (gender == "male") {r = new NanRen();} else if (gender == "female") {r = new NvRen();}return r;}
}class RenYaoFactory implements Factory {public Ren createRen(String gender) {Ren r = new RenYao(); // 人妖是不在乎性别的return r;}
}class ShouRenFactory implements Factory {public Ren createRen(String gender) {Ren r = new ShouRen(); // 兽人是虽然是有性别的,但是我们分不清~return r;}
}public class Laboratory {public static void main(String[] args) {Factory rf = new RenFactory();Ren nan = rf.createRen("male");Ren nv = rf.createRen("female");Factory ryf = new RenYaoFactory();Ren ry = ryf.createRen(null);Factory srf = new ShouRenFactory();Ren sr = srf.createRen(null);}
}

抽象工厂模式

自从我们成功兼并泰国和太阳两家实验室,我们实验室反而陷入了亏损的泥潭,这只能说这是一个疯狂的市场,因为我们的客户不满足我们出售的各种赤果果的人,竟然还想让他们穿上衣服。为了我们伟大的市场,我们实验室只能再次收购了衣服加工厂,并且根据生产人的经验,我们分别为正常人,人妖,兽人建立了不同的衣服厂。

class YiFu {}class NanRenYiFu extends YiFu {}class NvRenYiFu extends YiFu {}class RenYaoYiFu extends YiFu {}class ShouRenYiFu extends YiFu {}interface YiFuFactory {public abstract YiFu createYiFu(String gender);
}class RenYiFuFactory implements YiFuFactory {public YiFu createYiFu(String gender) {YiFu yf = null;if (gender == "male") {yf = new NanRenYiFu();} else if (gender == "female") {yf = new NvRenYiFu();}return yf;}
}class RenYaoYiFuFactory implements YiFuFactory {public YiFu createYiFu(String gender) {YiFu yf = new RenYaoYiFu();return yf;}
}class ShouRenYiFuFactory implements YiFuFactory {public YiFu createYiFu(String gender) {YiFu yf = new ShouRenYiFu();return yf;}
}

我们以为有着以前的经验,加个衣服厂肯定是简单的事情,但是当我们将我们的产品投放市场的时候,发现常常将人妖穿的衣服给兽人穿上了,兽人的衣服却给人妖穿上了。我们的特殊爱好客户完全受不了穿着齐X小短裙的兽人。

public class Laboratory {public static void main(String[] args) {Factory rf = new RenFactory();Ren nan = rf.createRen("male");Ren nv = rf.createRen("female");//人妖穿上了兽人的露胸皮坎肩Factory ryf = new RenYaoFactory();Ren ry = ryf.createRen(null);YiFuFactory sryff = new ShouRenYiFuFactory();YiFu ryyf = sryff.createYiFu(null);//兽人穿上了人妖的齐X小短裙Factory srf = new ShouRenFactory();Ren sr = srf.createRen(null);YiFuFactory ryyff = new RenYaoYiFuFactory();YiFu sryf = ryyff.createYiFu(null);}
}

为了解决问题,我们的资深顾问提出了新的建议:我们再新建几座组装工厂。

interface ZuZhuangFactory {public abstract Factory createFactory();public abstract YiFuFactory createYiFuFactory();
}class RenZuZhuangFactory implements ZuZhuangFactory {public Factory createFactory() {return new RenFactory();}public YiFuFactory createYiFuFactory() {return new RenYiFuFactory();}
}class RenYaoZuZhuangFactory implements ZuZhuangFactory {public Factory createFactory() {return new RenYaoFactory();}public YiFuFactory createYiFuFactory() {return new RenYaoYiFuFactory();}
}class ShouRenZuZhuangFactory implements ZuZhuangFactory {public Factory createFactory() {return new ShouRenFactory();}public YiFuFactory createYiFuFactory() {return new ShouRenYiFuFactory();}
}

现在实验室就能正确的生产人和衣服也套件了

public class Laboratory {public static void main(String[] args) {ZuZhuangFactory zzf = new RenZuZhuangFactory();Factory rf = zzf.createFactory();YiFuFactory ryff = zzf.createYiFuFactory();Ren nan = rf.createRen("male");Ren nv = rf.createRen("female");YiFu nanyf = ryff.createYiFu("male");YiFu nvyf = ryff.createYiFu("female");// 人妖组装工厂里拿不到兽人的衣服ZuZhuangFactory ryzzf = new RenYaoZuZhuangFactory();Factory ryf = ryzzf.createFactory();YiFuFactory ryyff = ryzzf.createYiFuFactory();Ren ry = ryf.createRen(null);YiFu ryyf = ryyff.createYiFu(null);// 兽人组装工厂里拿不到人妖的齐X小短裙ZuZhuangFactory srzzf = new ShouRenZuZhuangFactory();Factory srf = srzzf.createFactory();YiFuFactory sryff = srzzf.createYiFuFactory();Ren sr = srf.createRen(null);YiFu sryf = sryff.createYiFu(null);}
}

以下是全部源码

View Code

class Ren {}class NanRen extends Ren {}class NvRen extends Ren {}class RenYao extends Ren {}class ShouRen extends Ren {}interface Factory {public abstract Ren createRen(String gender);
}class RenFactory implements Factory {public Ren createRen(String gender) {Ren r = null;if (gender == "male") {r = new NanRen();} else if (gender == "female") {r = new NvRen();}return r;}
}class RenYaoFactory implements Factory {public Ren createRen(String gender) {Ren r = new RenYao(); // 人妖是不在乎性别的return r;}
}class ShouRenFactory implements Factory {public Ren createRen(String gender) {Ren r = new ShouRen(); // 兽人是虽然是有性别的,但是我们分不清~return r;}
}class YiFu {}class NanRenYiFu extends YiFu {}class NvRenYiFu extends YiFu {}class RenYaoYiFu extends YiFu {}class ShouRenYiFu extends YiFu {}interface YiFuFactory {public abstract YiFu createYiFu(String gender);
}class RenYiFuFactory implements YiFuFactory {public YiFu createYiFu(String gender) {YiFu yf = null;if (gender == "male") {yf = new NanRenYiFu();} else if (gender == "female") {yf = new NvRenYiFu();}return yf;}
}class RenYaoYiFuFactory implements YiFuFactory {public YiFu createYiFu(String gender) {YiFu yf = new RenYaoYiFu();return yf;}
}class ShouRenYiFuFactory implements YiFuFactory {public YiFu createYiFu(String gender) {YiFu yf = new ShouRenYiFu();return yf;}
}interface ZuZhuangFactory {public abstract Factory createFactory();public abstract YiFuFactory createYiFuFactory();
}class RenZuZhuangFactory implements ZuZhuangFactory {public Factory createFactory() {return new RenFactory();}public YiFuFactory createYiFuFactory() {return new RenYiFuFactory();}
}class RenYaoZuZhuangFactory implements ZuZhuangFactory {public Factory createFactory() {return new RenYaoFactory();}public YiFuFactory createYiFuFactory() {return new RenYaoYiFuFactory();}
}class ShouRenZuZhuangFactory implements ZuZhuangFactory {public Factory createFactory() {return new ShouRenFactory();}public YiFuFactory createYiFuFactory() {return new ShouRenYiFuFactory();}
}public class Laboratory {public static void main(String[] args) {ZuZhuangFactory zzf = new RenZuZhuangFactory();Factory rf = zzf.createFactory();YiFuFactory ryff = zzf.createYiFuFactory();Ren nan = rf.createRen("male");Ren nv = rf.createRen("female");YiFu nanyf = ryff.createYiFu("male");YiFu nvyf = ryff.createYiFu("female");// 人妖组装工厂里拿不到兽人的衣服ZuZhuangFactory ryzzf = new RenYaoZuZhuangFactory();Factory ryf = ryzzf.createFactory();YiFuFactory ryyff = ryzzf.createYiFuFactory();Ren ry = ryf.createRen(null);YiFu ryyf = ryyff.createYiFu(null);// 兽人组装工厂里拿不到人妖的齐X小短裙ZuZhuangFactory srzzf = new ShouRenZuZhuangFactory();Factory srf = srzzf.createFactory();YiFuFactory sryff = srzzf.createYiFuFactory();Ren sr = srf.createRen(null);YiFu sryf = sryff.createYiFu(null);}
}

到这一步我们的市场基本就能稳定下来了,也需你也可以给我们的产品附送一顶帽子,试试看吧!

总结

简单工厂模式最简单,我们只有一个工厂类,根据不同的需求返回不同的产品实例。

工厂方法模式是我们有一系列类似的工厂,客户可以根据不同的需求构建不同的工厂来生产产品。

抽象工厂模式是工厂方法模式的进一步抽象:我们有一系列类似的工厂,这些工厂的产品是一些工厂族。

转载于:https://www.cnblogs.com/biglaojiang/archive/2013/05/09/3068831.html

设计模式笔记之二(工厂模式)相关推荐

  1. 设计模式 笔记4 | 简单工厂模式 在源码中的应用 | Calendar 日历 | 源码浅析 | 使用总结 | 建造者模式

    文章目录 一.Calendar 日历类 1.1 内部属性 1.2 设置时间属性值 1.3 获取时间属性 1.4 使用 Calander 计算时间 二.Calender 类中的设计模式 2.1 简单工厂 ...

  2. 【23种设计模式专题】二 工厂模式

    程序猿学社的GitHub,欢迎Star github技术专题 本文已记录到github 文章目录 前言 小故事 传统方式 简单工厂(第一种) 工厂方法模式(第二种) 抽象工厂模式(第三种) 使用工厂方 ...

  3. 设计模式笔记之二工厂方法模式

    工厂方法模式 为什么引入工厂方法模式? 当我们需要创建多个实例的时候,而这些类又是有着公共的方法,区别就是实现的具体操作不同,我们需要专门为这些类创建实例,但是,如果我们没有创建这些的类的权限的时候, ...

  4. 设计模式笔记一:工厂模式

    原文:http://www.runoob.com/design-pattern/design-pattern-intro.html 少许个人理解,如有错误请指出 工厂模式(Factory Patter ...

  5. 【设计模式笔记】抽象工厂模式

    围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂. 提供了一种创建对象的最佳方式. 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显示指定它们的类. 每个生成的工厂都能按照工厂 ...

  6. 设计模式笔记之三抽象工厂模式

    抽象工厂模式 为什么引入抽象工厂模式? 一个接口代表一系列操作,当我们需要的对象需要多个接口,而这些接口又是不相干的,同时对于类的创建我们不需要知道具体的实现细节,只需要知道某个特征就可以,虽然工厂方 ...

  7. 设计模式(五)--工厂模式汇总

    LZ想把简单工厂模式.工厂方法模式和抽象工厂模式整理到一篇博文当中,由浅入深,应该能方便理解和记忆,话不多说,进入正题. 一.简单工厂模式 定义:从设计模式的类型上来说,简单工厂模式是属于创建型模式, ...

  8. 一口气讲完设计模式(单例模式、工厂模式、原型模式、建造者模式、适配器、桥梁模式)

    设计模式 使用设计模式,可以让我们的代码具有更好的可读性.可扩展性.可读性.重用性.符合高内聚低耦合的特点.作为程序员,是我们经常听到的概念,也是我们程序员必须深入学习,了解的知识. 设计模式种类 该 ...

  9. JAVA设计模式之3种工厂模式

    转自 JAVA设计模式之3种工厂模式 创建型模式 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离.为了使软件的结构更加清晰,外 ...

  10. 设计模式C#描述——抽象工厂模式

    设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产 ...

最新文章

  1. 学科交叉是科学发展的必然趋势
  2. python中的迭代库
  3. 在Android Studio环境下使用ESPRESSO 测试框架进行UI测试
  4. Hive 空值、NULL判断
  5. 【渝粤题库】陕西师范大学209041 金融工程学 作业(专升本)
  6. mysql的每隔1分钟定时_深入研究MySQL(四)、备份与恢复
  7. c语言变量强制转换,C语言——“=”中的强制类型转换
  8. mysql的入门基础操作
  9. CodeSmith Professional 5与VS2010有冲突
  10. javassm框架项目实例_面试官:小伙子,给我说一下spring框架吧
  11. matlab二阶系统设置参数,一阶和二阶系统响应的matlab制作
  12. 单片机学习笔记(五)
  13. 从零开始实现Unity光照模型_02_为Shader添加简单的多光源支持_技术美术基础学习记录
  14. 零售行业新渠道,效率居然这么高?
  15. re正则表达式匹配多行文本
  16. s5pv210 linux,S5PV210-零基础体验uboot
  17. 从宗教信仰看东西方文化对人的影响
  18. 嵌入式开发和c/c++编程经验总结
  19. 【Ubuntu】ThinkPad T470p 安装Win10 Ubuntu 16.04 双系统
  20. cocos2dx-lua 使用 luajit 加密 Android工程

热门文章

  1. “我来管管看”系列:如何消除报工数据与入库数据的差异?
  2. WEB版一次选择多个文件进行批量上传(Plupload)的解决方案
  3. sql与ORACLE链接服务器相互访问方法
  4. 读《非暴力沟通》马歇尔·卢森堡
  5. linux的swap相关
  6. 关于字符编码的一点学习。
  7. EF分组后把查询的字段具体映射到指定类里面的写法
  8. luogu P2344 奶牛抗议 DP 树状数组 离散化
  9. Socket 学习(三).5 UDP 的弱点
  10. 女孩们,当你说没有好男人时请进来看看!