• 前提导论
  • 故事
    • 不采用工厂模式
    • 简单工厂模式
    • 工厂方法模式
  • 故事
    • 抽象工厂模式
  • 故事结局

前提导论

为了学习设计模式时便于理解,我将用基于农夫和他的村子与森林为背景环境,讲一个故事时,阐述一个设计模式,今天作为第一个,我希望讲一个非常常见的设计模式–工厂模式。

故事

这是一个美丽而又安静祥和的村庄,村里的人日出而作日落而息,村子里,农夫靠伐木和打猎为生,女人呢,额。。。。总之,大家过着幸福美满的生活。 赵四是村子里为数不多的勤奋刻苦却聪明的农夫,同样靠着伐木为生,但他凭着自己敏锐的商业嗅觉,使得自己成为了村子里有钱的富人。
有一天,赵四想,我现在有钱了,我得打造把金斧子和银斧子,放在家里以示自己的出身和现在的尊贵。那现在有三种方式来打造金斧子和银斧子:

  • 第一、赵四自己有这种手艺,向首饰店借来了金斧子银斧子的模子,自己做;
  • 第二、赵四听说街上有一家首饰店,于是赵四向这家店订制金斧子和银斧子;
  • 第三、赵四听说镇上有一家超大的首饰店,它旗下有两家有名的工厂,一家专门打造金斧子,一家专门打造银斧子,赵四去这家店买需要的金斧子和银斧子就可以了;

故事讲到这,先告一段落,因为上面三种情况分别是不采用工厂模式、简单工厂模式和工厂方法模式。

不采用工厂模式

//造金斧子
public class GoldenAxe{public GoldenAxe(){System.out.println("打造金斧子");}
}
//造银斧子
public class SilverAxe{public SilverAxe(){System.out.println("打造银斧子");}
}
//靠赵四自己用模子自己打造金斧子和银斧子
public class ZhaoSi{public static void main(String[] args) {GoldenAxe ga = new GoldenAxe();SilverAxe sa = new SilverAxe();}
}

不采用工厂模式的缺点很明显,就是赵四打造金斧子和银斧子需要自己动手,也就是客户和产品之间的耦合度很高,不利于扩展。于是,简单工厂模式出现了。

简单工厂模式

public abstract class Axe{}
//造金斧子
public class GoldenAxe extends Axe{public GoldenAxe(){System.out.println("打造金斧子");}
}
//造银斧子
public class SilverAxe extends Axe{public SilverAxe(){System.out.println("打造银斧子");}
}
//街上的首饰店
public class Factory{//根据赵四的要求类型定制金斧子还是银斧子public Axe createAxe(String type){if("金斧子".equals(type)){return new GoldenAxe();}else if("银斧子".equals(type)){return new SilverAxe();}return null;}
}
public class ZhaoSi{public static void main(String[] args) {Factory fc = new Factory();Axe ga = fc.createAxe("金斧子");Axe sa = fc.createAxe("银斧子");}
}

简单工厂模式(也叫静态工厂方法模式),相对于不采用工厂模式来说,客户只需要知道自己要什么产品,至于产品如何做就交给工厂了,然而简单工厂的问题在于没有符合“对扩展开放,对修改闭合”的设计原则。拿上面例子来说,如果赵四有一天说他想打造一把钻石斧子,那这家首饰店就手足无措了,因为这家工厂目前只会打造金斧子和银斧子,因为赵四的需求,这家工厂得找会打造钻石斧子的人来做,也就是createAxe方法内要多一种情况了。为了符合“对扩展开放,对修改闭合”的设计原则,出现了本文第二种工厂模式–工厂方法模式。

工厂方法模式

public abstract class Axe{}
//造金斧子
public class GoldenAxe extends Axe{public GoldenAxe(){System.out.println("打造金斧子");}
}
//造银斧子
public class SilverAxe extends Axe{public SilverAxe(){System.out.println("打造银斧子");}
}
//镇上的首饰店
public interface Factory{public Axe createAxe();
}
//旗下一家打造金斧子的工厂
public class GoldenAxeFactory implements Factory{public  Axe createAxe(){return new GoldenAxe();}
}
//旗下另一家打造银斧子的工厂
public class SilverAxeFactory implements Factory{public Axe createAxe(){return new SilverAxe();}
}//赵四向镇上首饰店下单买金斧子和银斧子,首饰店就会交给打造金斧子的工厂,和打造银斧子的工厂去分别造金斧子和银斧子
public class ZhaoSi{public static void main(String[] args) {Factory gafc = new GoldenAxeFactory();Axe ga = gafc.createAxe();Factory safc = new SilverAxeFactory();Axe sa = safc.createAxe();}
}

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。到这里,貌似工厂模式差不多讲完了,然而并没有,因为,因为赵四有另一故事。

故事

赵四得到了通过镇上的首饰店买到了金斧子和银斧子,但是他又想干脆再买套金锤子,银锤子吧(伐木工暴发户的劣根性啊),这怎么搞呢?街上没有、镇上没有,这时赵四听说县里有家更大的首饰店,它旗下有两家工厂,一家打造金器,一家打造银器,每家工厂下都会打造斧子和锤子。赵四一听乐了,赶紧向这家店下订单了。
这就是在工厂方法模式上更加复杂化些的,抽象工厂模式啦。

抽象工厂模式

//斧子
public abstract class Axe{}
//造金斧子
public class GoldenAxe extends Axe{public GoldenAxe(){System.out.println("打造金斧子");}
}
//造银斧子
public class SilverAxe extends Axe{public SilverAxe(){System.out.println("打造银斧子");}
}
//锤子
pulic abstract class Hammer{}
//造金锤子
public class GoldenHammer extends Hammer{public GoldenHammer(){System.out.println("打造金锤子");}
}
//造银锤子
public class SilverHammer extends Hammer{public SilverHammer(){System.out.println("打造银锤子");}
}
//县里的首饰店
public interface Factory{public Axe createAxe();//造斧子public Hammer createHammer();//造锤子
}
//旗下的打造金器的工厂
public class GoldFactory implements Factory{@Overridepublic Axe createAxe() {return new GoldenAxe();}@Overridepublic Hammer createHammer() {return new GoldenHammer();}}
//打造银器的工厂
public class SilverFactory implements Factory{@Overridepublic Axe createAxe() {return new SilverAxe();}@Overridepublic Hammer createHammer() {return new SilverHammer();}}public class ZhaoSi{public static void main(String[] args) {Factory gf = new GoldFactory();gf.createAxe();gf.createHammer();Factory sf = new SilverFactory();sf.createAxe();sf.createHammer();}
}

到此,抽象工厂模式出来了。比较抽象工厂模式和工厂方法模式,无非就是产品从单一到多类,像上面的故事,从斧子到锤子,然而每类产品又有多种具体品种,比如斧子有金斧子和银斧子,锤子有金锤子和银锤子,这个时候将其组合实现时,就需要一个大的工厂来具体实现,比如GoldFactory用来实现打造金器(金斧子和金锤子)。

故事结局

好啦,工厂模式中涉及到的几种模式就讲完了,我这边不在意工厂模式的理论细节,只是希望通过通俗易懂的故事看到各个模式的区别,从无到有,从单一到多样化,自己从代码中慢慢品味才能更好的体会这种模式的妙处。

【设计模式】简单工厂模式+工厂方法模式+抽象工厂模式相关推荐

  1. 【设计模式】Unity3D 简单工厂、工厂(方法)、抽象工厂模式

    创建型模式-工厂三兄弟 提示:个人学习总结,如有错误,敬请指正 文章目录 创建型模式---工厂三兄弟 一.简单工厂模式 1.简单工厂模式是什么? 2.UML图 3.实现方式 二.工厂(方法)模式 1. ...

  2. C++设计模式 | Factory工厂模式(简单工厂、工厂方法、抽象工厂)

    目录 简单工厂 工厂方法 抽象工厂 学习工厂模式需要有C++虚函数 纯虚函数等相关继承与多态知识 简单工厂 在简单工厂模式中,可以根据参数的不同返回不同的实例..简单工厂模式专门定义一个类来负责创建其 ...

  3. 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

    工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...

  4. 设计模式:工厂方法与抽象工厂模式

    说明:这篇blog写的很好,有助于理解工厂方法与抽象工厂模式的联系与区别. 原文链接:http://blog.csdn.net/yzxz/article/details/4601152 抽象工厂模式与 ...

  5. 工厂模式(简单工厂,工厂方法,抽象工厂)

    工厂顾名思义就是创建产品,工厂分为三种:简单工厂,工厂方法,抽象工厂.该模式用于封装和管理对象的创建,是一种创建型模式. 1)简单工厂 该模式通过向工厂传递类型来指定要创建的对象 提供一个方法,根据类 ...

  6. 工厂模式之简单工厂、工厂方法、抽象工厂分析对比

    工厂模式有三种分类,简单工厂(也叫静态工厂).工厂方法模式.抽象工厂 一.简单工厂 简单工厂通俗的说就是提供一个类,这个类中的某个方法根据入参的不同来创建并返回实现了同一个接口的不同具体子类(产品). ...

  7. C++工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式 前言 为什么要使用工厂模式 优点 缺点 简单工厂(Simple Factory) 代码 应用 不足 工厂方法(Factory Method) 代码 应用 不足 抽象工厂(Abstract F ...

  8. 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  9. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  10. 【设计模式实战】简单工厂、工厂方法、抽象工厂:原理篇

    小明开发的应用,经常要从XML或者Asset中读取省市区数据. 小明是这样写的: public abstract class IOHandler {/*** 添加*/public abstract v ...

最新文章

  1. VS Code 安装 Go 插件、自定义扩展配置、断点调试
  2. Python黑客编程基础3网络数据监听和过滤
  3. vue的基本项目结构
  4. 【CodeForces - 245H 】Queries for Number of Palindromes (带容斥的区间dp)
  5. Linux——软件包简单学习笔记
  6. CNN经典模型:VGGNet
  7. Python常用小技巧(五)——批量读取json文件
  8. Sql 2005 中比较两个数据库差异
  9. 湖南大学计算机学院张柏杨,王树林-湖大信息科学与工程学院
  10. 爱快路由器下水星(Mercury)无线管理器AC跨三层发现AP
  11. 金蝶K3案例教程库存报表
  12. Centos7防火墙iptables安装及设置图文并茂【实现防火墙管理功能】
  13. 线性代数的本质_01_向量、张成空间与基
  14. 7z格式、LZMA压缩算法和7-Zip详细介绍
  15. java基础:面向对象编程23-this课后练习boygirl
  16. python语言中整数1010的二进制是多少_10的二进制是多少哦啊?怎么算 O(∩_∩)O谢谢?...
  17. 美国的做法致芯片市值持续暴跌5000亿美元,美国芯片则祈求中国买更多芯片
  18. BST、AVL、BTree、B+Tree、B*Tree、23Tree、234Tree、TTree、RBTree、LLRBTree、AATree、SplayTree、Treap、无旋Treap、scap
  19. STM32的PDR_ON引脚,比较好的解释(转载+补充)
  20. 从A15跑分看库克精准刀法:Pro版GPU强很多,mini 6不敌手机

热门文章

  1. javasript的单线程和多线程
  2. ES修改集群最大分片数量max_shards_per_node
  3. X509和CA的关系
  4. Grid Control 和 Database Control
  5. 低信噪比MIMO SC-FDE系统中信道估计的研究与实现
  6. 互联网创业公司是否需要技术外包?
  7. 共享汽车管理系统设计软便件研究
  8. 课程能力建设:提高五年制高职教学有效性的重要途径
  9. 自动合并table中相同的单元格以及java自动合并excel相同单元格
  10. web -【在线聊天】