设计模式笔记之二(工厂模式)
说道设计模式,最先讲到的设计模式必然是工厂系列的设计模式。下面我们就来看下工厂系列设计模式:
简单工厂模式
简单工厂模式严格来说都不是一种设计模式,只是工厂方法模式的一个简单实现,但是我们平时运用最多就是这个简单工厂模式。
简单工厂模式通常用在固定且不大会改变的类族的创建。举个简单的例子,我们现在有个生化实验室来克隆人,所以我们要有一个人的模具
人是一个父类:
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");} }
上面就是一个简单工厂模式的简单例子。以下是具体全部代码
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);} }
并且在一段时候后我们实验室成功兼并了太阳实验室,并在太阳当地设置了我们的兽人工厂。
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);} }
以下是全部源码
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
设计模式笔记之二(工厂模式)相关推荐
- 设计模式 笔记4 | 简单工厂模式 在源码中的应用 | Calendar 日历 | 源码浅析 | 使用总结 | 建造者模式
文章目录 一.Calendar 日历类 1.1 内部属性 1.2 设置时间属性值 1.3 获取时间属性 1.4 使用 Calander 计算时间 二.Calender 类中的设计模式 2.1 简单工厂 ...
- 【23种设计模式专题】二 工厂模式
程序猿学社的GitHub,欢迎Star github技术专题 本文已记录到github 文章目录 前言 小故事 传统方式 简单工厂(第一种) 工厂方法模式(第二种) 抽象工厂模式(第三种) 使用工厂方 ...
- 设计模式笔记之二工厂方法模式
工厂方法模式 为什么引入工厂方法模式? 当我们需要创建多个实例的时候,而这些类又是有着公共的方法,区别就是实现的具体操作不同,我们需要专门为这些类创建实例,但是,如果我们没有创建这些的类的权限的时候, ...
- 设计模式笔记一:工厂模式
原文:http://www.runoob.com/design-pattern/design-pattern-intro.html 少许个人理解,如有错误请指出 工厂模式(Factory Patter ...
- 【设计模式笔记】抽象工厂模式
围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂. 提供了一种创建对象的最佳方式. 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显示指定它们的类. 每个生成的工厂都能按照工厂 ...
- 设计模式笔记之三抽象工厂模式
抽象工厂模式 为什么引入抽象工厂模式? 一个接口代表一系列操作,当我们需要的对象需要多个接口,而这些接口又是不相干的,同时对于类的创建我们不需要知道具体的实现细节,只需要知道某个特征就可以,虽然工厂方 ...
- 设计模式(五)--工厂模式汇总
LZ想把简单工厂模式.工厂方法模式和抽象工厂模式整理到一篇博文当中,由浅入深,应该能方便理解和记忆,话不多说,进入正题. 一.简单工厂模式 定义:从设计模式的类型上来说,简单工厂模式是属于创建型模式, ...
- 一口气讲完设计模式(单例模式、工厂模式、原型模式、建造者模式、适配器、桥梁模式)
设计模式 使用设计模式,可以让我们的代码具有更好的可读性.可扩展性.可读性.重用性.符合高内聚低耦合的特点.作为程序员,是我们经常听到的概念,也是我们程序员必须深入学习,了解的知识. 设计模式种类 该 ...
- JAVA设计模式之3种工厂模式
转自 JAVA设计模式之3种工厂模式 创建型模式 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离.为了使软件的结构更加清晰,外 ...
- 设计模式C#描述——抽象工厂模式
设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产 ...
最新文章
- 学科交叉是科学发展的必然趋势
- python中的迭代库
- 在Android Studio环境下使用ESPRESSO 测试框架进行UI测试
- Hive 空值、NULL判断
- 【渝粤题库】陕西师范大学209041 金融工程学 作业(专升本)
- mysql的每隔1分钟定时_深入研究MySQL(四)、备份与恢复
- c语言变量强制转换,C语言——“=”中的强制类型转换
- mysql的入门基础操作
- CodeSmith Professional 5与VS2010有冲突
- javassm框架项目实例_面试官:小伙子,给我说一下spring框架吧
- matlab二阶系统设置参数,一阶和二阶系统响应的matlab制作
- 单片机学习笔记(五)
- 从零开始实现Unity光照模型_02_为Shader添加简单的多光源支持_技术美术基础学习记录
- 零售行业新渠道,效率居然这么高?
- re正则表达式匹配多行文本
- s5pv210 linux,S5PV210-零基础体验uboot
- 从宗教信仰看东西方文化对人的影响
- 嵌入式开发和c/c++编程经验总结
- 【Ubuntu】ThinkPad T470p 安装Win10 Ubuntu 16.04 双系统
- cocos2dx-lua 使用 luajit 加密 Android工程