目录

  1. 工厂模式

  2. 为什么使用工厂模式

  3. 应用实例

工厂模式

工厂模式:是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品

这里所提到的依赖注入,对于依赖的创建思想又引出一个概念:依赖倒置即为高层组件不再依赖底层组件,而底层组件也不再依赖高层组件,而是出现一个工厂类,高底层组建依赖于这个工厂类。下面针对具体的例子来进行讲解。

为什么使用工厂模式

工厂,生产物品的地方。工厂模式就是用来创建对象,生产对象的。一般,我们会通过new来进行对象的创建,一旦通过new,那么就一定会有具体的实例出现,也就会使得该对象和当前类出现紧耦合,产生依赖,使得我们代码的可扩展性和灵活性都变低。继续我们上篇文章中工厂生产机器的例子。

//机器装配的基类
public abstract class Machine{
//机器装配的流程,final不可被复写,保证方装配算法不被破坏final void produce(){createFrame();addHead();addBody();if(ifDressup())dressUp();}
//创建框架public abstract void createFrame();
//添加一个机器头public abstract void addHead();
//添加一个机器的身子public abstract void addBody();
//为机器进行装扮public abstract void dressUp();
//判断是否为该机器进行装扮public boolean ifDressup(){return true;}}
//继承自基类的一个子类
public class InflatableDoll extends Machine{public void createFrame(){System.out.println("This is a Frame");}public void addBody(){System.out.println("This is a body");}public void dressUp(){System.out.println("This is a beautiful cloth");}}

这是我们通过模板方法创建来创建我们机器的一个例子,那么现在我们有了一个新的需求,我们要对这些所有的机器在出售的时候要进行一个包装,根据客户点的类型,然后对其进行相应的包装之后,然后才可以出售。不同机器的包装流程大致相似的,所以我们可以这样来写我们的前台销售部门。

public class Store{public void order(String type){Machine machine;if(type=="inflatedoll"){machine = new InflatableDoll();}else if(type==""){....}machine.produce();machine.firstPack();machine.secondPack();machine.thirdPack();machine.fourthPack();}}
public class InflatableDoll extends Machine{public void firstPack(){System.out.prinltn("Add first pack to protect");}public void secondPack(){System.out.prinltn("Add second pack to protect");}public void thirdPack(){System.out.prinltn("Add third pack to protect");}public void fourthPack(){System.out.prinltn("Add fourth pack to protect");}
}

但是问题来了,当我们的机器种类不断增多,对于机器类型的判断,然后创建会使得我们的代码变得很繁琐,而且灵活性很差,按照设计模式的原则,封装变化的,我们将对与机器类型的判断和机器的创建封装起来,我们该这个封装起来的类起了个名字叫做工厂类,因为这个工厂类是可以用来产生新的对象的。封装代码如下。

public class MachineFactory{public Machine create(String type){Machine machine;if(type=="inflatabledoll"){machine = new InflatableDoll();}else if(){do something;}machine.produce();return machine;}
}

通过这个工厂类,我们的商店出售类就可以改变了,和具体的机器实例实现解耦和。

public class Store{Store(){MachineFactory factory = new MachineFactory();}public void order(String type){Machine machine= factory.create(type);machine.firstPack();machine.secondPack();machine.thirdPack();machine.fourthPack();}
}

顿时就感觉代码简洁了好多,而且条理也变得很清晰了。
通过例子,再去对我们之前的概念去理解,就会变得清晰很多,抽象工厂,具体工厂,抽象产品,具体产品。依赖注入,依赖倒置。首先对于抽象工厂和具体的工厂的理解,因为我们不同的产品可能在其生产上还是存在一些差异,所以通过一个抽象工厂类作为基类,然后针对不同的地方分别建立不同的类,根据这些类,我们来创建我们相应的产品,为了实现商店类和产品的松耦合,我们定义一个抽象产品类,然后所有的产品都将从这个抽象类继承,然后实现自己的相应的方法,然后通过一个工厂类工厂方法注入实例,实例以委托的形式,来执行相应的操作。
依赖倒置:按照我们的传统思路,我们商店要出售商品,那么我们的商店就要依赖商品,而这里我们从底层的角度去向高层进阶,我们有商品,商品的创建需要一个工厂类,而商店类,则不再依赖于产品,产品也不再依赖于商店类,我们的第一种写法,在商店类中对于我们要创建的类进行的判断,我们就可以将其理解为商品对于商店类的依赖。而现在,其全部依赖于工厂类,通过一个工厂类,实现解耦。同时也使得之前的依赖出现了倒置,又高层依赖底层转为底层依赖高层。

应用实例

实际设计中,工厂模式用的也是比较多,而且这种模式也会比较好辨识,带有Factory。比如Android中的

public interface ThreadFactory {Thread newThread(Runnable r);
}

下篇更新状态模式

设计模式(9)工厂模式(讲解+应用)相关推荐

  1. 面向对象编程设计模式--简单工厂模式讲解(历史上最简单明白的例子)

    工作之余,在看资料过程中发现一个极易理解的简单工厂模式的例子,自己亲自试练一番,感觉对这个设计模式不熟悉的朋友, 一看马上就知道是什么回事了. 简单工厂模式根据提供给它的数据,返回几个可能类中的一个类 ...

  2. JAVA设计模式之工厂模式讲解

    目录 前言 开始表演 前言 Java中使用工厂模式的主要原因是为了实现代码的灵活性和可维护性.工厂模式是一种创建型设计模式,它提供了一种将对象的创建和使用进行分离的方式.具体来说,工厂模式可以将对象的 ...

  3. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  4. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  5. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  6. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  7. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  8. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

  9. 设计模式之工厂模式(三)

    上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...

  10. 教你如何一篇博客读懂设计模式之—--工厂模式

    一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...

最新文章

  1. 记一次Java进程突然消失问题
  2. 平面设计现在行业发展如何?
  3. SAP人工智能服务Recast.AI的一个简单例子
  4. 在deepin上安装YouCompleteMe
  5. DyFPN:浙大华为诺亚西湖大学等提出用于目标检测的动态特征金字塔,减少40%的FLOPs!...
  6. 设计模式——策略模式详解
  7. 用 IPTABLES 构建 Linux 防火墙
  8. 论文笔记_S2D.34-2015-CVPR_从单张图像进行深度估计的深度卷积神经场
  9. com.android.phone lg g3,详细的lg g3 root教程与方法
  10. SURF算法python实现
  11. 2020计算机博弈大赛幻影围棋分组第二天 围棋规则学习
  12. 《轩辕剑4苍之涛》另一攻略 (3)
  13. 霸屏三大综艺 小度强势破圈引发“胜利者效应”
  14. Unity3d 数字模型制作规范
  15. wordpress最佳架构_如何在2019年选择WordPress主题:最佳选择
  16. mplayer - Linux下的电影播放器
  17. 计算机技术调剂控制工程,控制工程294求调剂 - 考研 - 小木虫 - 学术 科研 互动社区...
  18. Html标签分类及总结
  19. Linux--装好之后要做的几件事(转)
  20. 网络编程进阶---- hamc模块 socketserver模块验证合法性 两者进行通信连接

热门文章

  1. 程序员的职业素养---编码
  2. NIST 发布关于使用“行政令-关键软件”的安全措施指南
  3. Stringlifier:Adobe 开源日志清理和凭据暴露检测工具
  4. 十(7)rsync:介绍、常用选项、通过ssh同步、通过服务同步、linux系统日志、screen...
  5. ubuntu server 10.4下LAMP的安装
  6. openssl evp 对称加密(AES_ecb,ccb)
  7. android开发实践之1:安装部署环境设置
  8. centos下 安装jdk
  9. linux配置NFS系统
  10. c++ ANSI、UNICODE、UTF8互转