文章目录

  • 一、前言
  • 二、工厂模式
  • 三、总结

设计模式一: 《用一个营销策略的实例说清楚策略模式的应用场景》
设计模式二: 《用一个股票买卖的例子说清楚观察者模式》
设计模式三: 《用一个苏式面条的实例说清楚装饰者模式》


一、前言

  • 在前面三篇文章中,我们接触到的策略模式、观察者模式、装饰者模式主要解决的是封装变化、类之间的解耦、增强扩展性等这一类问题。
  • 本章我们将学习一种新的设计模式:工厂模式。

二、工厂模式

  • 从字面上看,称之为工厂,是要创建产品的,也即工厂模式是一种创建型模式。
  • 我们先举一个简单的例子:
  1. 定义一个手机抽象类,再根据该抽象类产生苹果手机和华为手机两个子类
/*** 手机抽象类*/
public abstract class Phone {abstract void getName();
}/*** 苹果手机*/
public class ApplePhone extends Phone {@Overridevoid getName() {System.out.println("苹果手机");}
}/*** 华为手机*/
public class HuaweiPhone extends Phone {@Overridevoid getName() {System.out.println("华为手机");}
}
  1. 有三个客户端分别调用以上两个手机子类创建对象:
/*** 创建手机对象客户端1*/
public class Test1 {public static void main(String[] args) {System.out.println("客户端1创建手机:");Phone phone1 = new ApplePhone();phone1.getName();Phone phone2 = new HuaweiPhone();phone2.getName();}
}/*** 创建手机对象客户端2*/
public class Test2 {public static void main(String[] args) {System.out.println("客户端2创建手机:");Phone phone1 = new ApplePhone();phone1.getName();Phone phone2 = new HuaweiPhone();phone2.getName();}
}/*** 创建手机对象客户端3*/
public class Test3 {public static void main(String[] args) {System.out.println("客户端3创建手机:");Phone phone1 = new ApplePhone();phone1.getName();Phone phone2 = new HuaweiPhone();phone2.getName();}
}
  1. 三个客户端分别运行:
  2. 以上看起来一切正常,但过了一段时间,我们需要对手机抽象类进行更改,比如需要增加手机制造商名称:
/*** 手机抽象类*/
public abstract class Phone {// 制造商protected String mfrs;Phone(String mfrs){this.mfrs = mfrs;}abstract void getName();
}/*** 苹果手机*/
public class ApplePhone extends Phone {ApplePhone(String mfrs) {super(mfrs);}@Overridevoid getName() {System.out.println("苹果手机:"+"制造商:"+mfrs);}
}/*** 华为手机*/
public class HuaweiPhone extends Phone {HuaweiPhone(String mfrs) {super(mfrs);}@Overridevoid getName() {System.out.println("华为手机:"+"制造商:"+mfrs);}
}
  • 这时候再检查三个客户端都发生了错误:


  1. 这时候就需要考虑能不能将此手机对象的创建过程进行封装起来,避免客户端的重复修改,也即引入一个手机工厂类,各个客户端创建工厂对象,再通过工厂对象去创建各个手机对象。
/*** 工厂模式:手机工厂*/
public class PhoneFactory {Phone getPhone(String type){switch (type.toLowerCase()){case "apple":return new ApplePhone("富士康");case "huawei":return new HuaweiPhone("华为");default:return null;}}
}
/*** 创建手机对象客户端1*/
public class Test1 {public static void main(String[] args) {System.out.println("客户端1创建手机:");// 创建手机工厂PhoneFactory phoneFactory = new PhoneFactory();Phone phone1=phoneFactory.getPhone("apple");phone1.getName();Phone phone2=phoneFactory.getPhone("huawei");phone2.getName();}}// 客户端2和客户端3代码同上
....
  • 从以下UML图我们可以看到,三个客户端都通过PhoneFactory这个工厂创建手机对象实例,也即通过工厂模式将手机对象的创建封装了起来,以后手机类变化了,只需要修改工厂类,客户端代码无需变更

三、总结

  • 以上的例子中我们定义一个工厂类,可根据客户端传入的不同参数创建不同的业务实例。我们把这种工厂模式称为简单工厂,该工厂类负责所有业务类型的统一封装。
  • 在实际项目应用中,工厂模式还可以扩展成为工厂方法(将统一封装的工厂进行拆分为多个工厂)、抽象工厂(工厂可实现不同产品的创建),其原理都是相似的,请读者自行研究。

设计模式四:用一个生产手机的简单例子说清楚工厂模式相关推荐

  1. 简单(静态)工厂模式

    简单(静态)工厂模式 观察者模式 一.背景介绍 工厂模式是设计模式的一种,设计模式是自程序开发逐渐就有的,提高开发效率的一种设计思路,先前的开发者们一直在用,只是后来这四个人出了一本书总结了下,就是现 ...

  2. 设计模式之——简单(静态)工厂模式和抽象工厂模式

    文章目录 [关于设计模式] 设计模式的诞生 设计模式概念与解读 设计模式的原则 [关于工厂模式] 简单工厂(静态工厂)模式的概念 抽象工厂模式 工厂模式的使用时机和注意事项 给自己的思考 [关于设计模 ...

  3. 一个关于Remoting的简单例子

    前言 今天在整理以前写的一些demo,看到一个关于remoting的例子.好久不用remoting了,果断记录一下. 什么是Remoting 简单回顾下: 1.Remoting是一种远程通信,或者说跨 ...

  4. javascript设计模式简单介绍之【工厂模式】

    工厂模式分为两种,一种是简单工厂模式.另一种称之为工厂模式. 简单工厂模式是使用一个外部的单体或者静态方法来生成实例. 而工厂模式使用子类来决定内部成员要实现那个具体的类的实例. 工厂模式要求被具体实 ...

  5. 工厂设计模式(java版本、spring源码中使用的工厂模式)

    最近在学习spring源码,发现在IoC容器初始化的时候创建各种bean,然后在代码中看到各种beanFactory和factoryBean,很显然spring容器在创建bean的过程是使用了工厂设计 ...

  6. 深入浅出设计模式四——比萨店生产比萨实现(工厂方法模式)

    在http://quicker.iteye.com/blog/571714一文中已经讲了简单工厂和工厂方法并且有UML图和实现的代码. 这里只结合实例分析一下工厂方法在实际生活中的应用. 我们看看比萨 ...

  7. 微服务设计指导-通过一个生产事故的具体例子来看微服务

    前言 永远记得:微服务不是代表系统快.微服务不代表性能就好了.相反,实施了微服务后如果你没有掌握好要领,你反而会比没实施微服务"死了更惨". 这句话非常有意思.我们不急,看下去. ...

  8. 设计模式十三:用一个组配吃鸡电脑的例子说清楚建造者模式

    文章目录 一.背景 二.实现 三.总结 设计模式一: <用一个营销策略的实例说清楚策略模式的应用场景> 设计模式二: <用一个股票买卖的例子说清楚观察者模式> 设计模式三: & ...

  9. JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  10. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

最新文章

  1. python经典例题图形_Python 入门经典100实例:实例23 菱形
  2. 企业互联网应用高性能解决之道
  3. 《LeetCode力扣练习》剑指 Offer 10- I. 斐波那契数列 Java
  4. 【动态规划】leetcode - Maximal Square
  5. 《大规模web服务开发技术》阅读笔记
  6. (JAVA)CollectionDemo3
  7. python assert
  8. FreeRTOS内核实现02:任务的定义与任务切换
  9. android 终端 核心,android模块/核心板用于手持终端应用,选几米物联。
  10. 第十二章UML与Rational Rose 软件
  11. C++:单例模式——线程安全模式、饥汉模式、懒汉模式
  12. Eclipse Theia:Eclipse的继承者?
  13. 根据正则表达式创建NFA的Thompson算法 python实现
  14. 未来交通技术发展现状和我国面临的挑战
  15. 计算机用word做海报,【2人回答】电脑Word怎么做海报?-3D溜溜网
  16. EUV 光刻机到底有多重要?
  17. 软件测试的16种测试类型
  18. html转化成PDF
  19. 如何选择GPS定位器
  20. python电话号码_Python有效电话号码

热门文章

  1. java分解因式_Java将一个整数因式分解
  2. Softmax回归求导公式推导
  3. 有些打不开的国外网页
  4. 萌新入坑第一课——如何写技术博客
  5. 黄金面试技巧|应届生求职必备
  6. 微信公众号自动回复海报
  7. JAVA 图片格式检查方法
  8. 羽毛球·印尼赛 | 国羽男双新高塔组合惊喜进决赛
  9. leetcode_1370. 上升下降字符串
  10. 腾“云”架“雾”,3DCAT实时渲染带你进入元宇宙