设计模式四:用一个生产手机的简单例子说清楚工厂模式
文章目录
- 一、前言
- 二、工厂模式
- 三、总结
设计模式一: 《用一个营销策略的实例说清楚策略模式的应用场景》
设计模式二: 《用一个股票买卖的例子说清楚观察者模式》
设计模式三: 《用一个苏式面条的实例说清楚装饰者模式》
一、前言
- 在前面三篇文章中,我们接触到的策略模式、观察者模式、装饰者模式主要解决的是封装变化、类之间的解耦、增强扩展性等这一类问题。
- 本章我们将学习一种新的设计模式:工厂模式。
二、工厂模式
- 从字面上看,称之为工厂,是要创建产品的,也即工厂模式是一种创建型模式。
- 我们先举一个简单的例子:
- 定义一个手机抽象类,再根据该抽象类产生苹果手机和华为手机两个子类
/*** 手机抽象类*/
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*/
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();}
}
- 三个客户端分别运行:
- 以上看起来一切正常,但过了一段时间,我们需要对手机抽象类进行更改,比如需要增加手机制造商名称:
/*** 手机抽象类*/
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);}
}
- 这时候再检查三个客户端都发生了错误:
- 这时候就需要考虑能不能将此手机对象的创建过程进行封装起来,避免客户端的重复修改,也即引入一个手机工厂类,各个客户端创建工厂对象,再通过工厂对象去创建各个手机对象。
/*** 工厂模式:手机工厂*/
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这个工厂创建手机对象实例,也即通过工厂模式将手机对象的创建封装了起来,以后手机类变化了,只需要修改工厂类,客户端代码无需变更
三、总结
- 以上的例子中我们定义一个工厂类,可根据客户端传入的不同参数创建不同的业务实例。我们把这种工厂模式称为简单工厂,该工厂类负责所有业务类型的统一封装。
- 在实际项目应用中,工厂模式还可以扩展成为工厂方法(将统一封装的工厂进行拆分为多个工厂)、抽象工厂(工厂可实现不同产品的创建),其原理都是相似的,请读者自行研究。
设计模式四:用一个生产手机的简单例子说清楚工厂模式相关推荐
- 简单(静态)工厂模式
简单(静态)工厂模式 观察者模式 一.背景介绍 工厂模式是设计模式的一种,设计模式是自程序开发逐渐就有的,提高开发效率的一种设计思路,先前的开发者们一直在用,只是后来这四个人出了一本书总结了下,就是现 ...
- 设计模式之——简单(静态)工厂模式和抽象工厂模式
文章目录 [关于设计模式] 设计模式的诞生 设计模式概念与解读 设计模式的原则 [关于工厂模式] 简单工厂(静态工厂)模式的概念 抽象工厂模式 工厂模式的使用时机和注意事项 给自己的思考 [关于设计模 ...
- 一个关于Remoting的简单例子
前言 今天在整理以前写的一些demo,看到一个关于remoting的例子.好久不用remoting了,果断记录一下. 什么是Remoting 简单回顾下: 1.Remoting是一种远程通信,或者说跨 ...
- javascript设计模式简单介绍之【工厂模式】
工厂模式分为两种,一种是简单工厂模式.另一种称之为工厂模式. 简单工厂模式是使用一个外部的单体或者静态方法来生成实例. 而工厂模式使用子类来决定内部成员要实现那个具体的类的实例. 工厂模式要求被具体实 ...
- 工厂设计模式(java版本、spring源码中使用的工厂模式)
最近在学习spring源码,发现在IoC容器初始化的时候创建各种bean,然后在代码中看到各种beanFactory和factoryBean,很显然spring容器在创建bean的过程是使用了工厂设计 ...
- 深入浅出设计模式四——比萨店生产比萨实现(工厂方法模式)
在http://quicker.iteye.com/blog/571714一文中已经讲了简单工厂和工厂方法并且有UML图和实现的代码. 这里只结合实例分析一下工厂方法在实际生活中的应用. 我们看看比萨 ...
- 微服务设计指导-通过一个生产事故的具体例子来看微服务
前言 永远记得:微服务不是代表系统快.微服务不代表性能就好了.相反,实施了微服务后如果你没有掌握好要领,你反而会比没实施微服务"死了更惨". 这句话非常有意思.我们不急,看下去. ...
- 设计模式十三:用一个组配吃鸡电脑的例子说清楚建造者模式
文章目录 一.背景 二.实现 三.总结 设计模式一: <用一个营销策略的实例说清楚策略模式的应用场景> 设计模式二: <用一个股票买卖的例子说清楚观察者模式> 设计模式三: & ...
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
最新文章
- python经典例题图形_Python 入门经典100实例:实例23 菱形
- 企业互联网应用高性能解决之道
- 《LeetCode力扣练习》剑指 Offer 10- I. 斐波那契数列 Java
- 【动态规划】leetcode - Maximal Square
- 《大规模web服务开发技术》阅读笔记
- (JAVA)CollectionDemo3
- python assert
- FreeRTOS内核实现02:任务的定义与任务切换
- android 终端 核心,android模块/核心板用于手持终端应用,选几米物联。
- 第十二章UML与Rational Rose 软件
- C++:单例模式——线程安全模式、饥汉模式、懒汉模式
- Eclipse Theia:Eclipse的继承者?
- 根据正则表达式创建NFA的Thompson算法 python实现
- 未来交通技术发展现状和我国面临的挑战
- 计算机用word做海报,【2人回答】电脑Word怎么做海报?-3D溜溜网
- EUV 光刻机到底有多重要?
- 软件测试的16种测试类型
- html转化成PDF
- 如何选择GPS定位器
- python电话号码_Python有效电话号码