1.小C的故事

大家好,我叫张小C,我是一个厨师,专职烤面包。下面是我的工作。

public class World {public static void main(String[] args) {LittleC littleC = new LittleC();littleC.work();}
}public class LittleC {public void work() {Bread bread = new Bread();System.out.print(bread.getName()+"做好了!");System.out.println(bread.getTaste());}
}public class Bread {private String name = "面包";public String getName() {return name;}public String getTaste(){return "软软的,没什么味道";}
}

 

有一天,小明(老顾客)来到张小c的店中,以下是对话--- 
小明:我吃你家面包都吃腻了,有没有别的吃的,没有的话我以后就换地方了。 
小C:有有有,我马上做别的美味出来。

小C心想,我只会烤面包啊,该咋办,难不成再加个workForPizza,那要是这个也吃腻了总不能加到屎吧…况且我脑子笨,学得慢…好吧,爱吃不吃,你不吃自有人吃!(纯属意淫)

2.存在的问题

现在让我们来看一看小C现在面临的问题是什么,先看看work方法中直接new了一个Bread,把自己禁锢在了一种食物中。那有没有什么办法可以解决小c的当前困境呢?

3.工厂方法模式登场

小强:小C,我最近开了一个Pizza店,什么时候过来吃Pizza啊? 
小C:太好了,我正愁呢。这样咱们合作,顾客在我这里点Pizza的时候,你们店就给我做一个Pizza送过来。互利共赢嘛。 
小强:好,一言为定。 
也许最近流行开餐馆,小C的朋友小梅开了家饺子馆,小C用同样的方法让小梅加盟了。 而且为了专心运营,连自己的烤面包工作都外包给小红的面包店了。 
经过酝酿,新的设计出现了:下面是代码摘要:

public class World {public static void main(String[] args) {LittleC littleC = new LittleC();System.out.println("小明:我要吃面包!");littleC.setFoodShop(new BreadShop());littleC.work();System.out.println("小明:我要吃饺子!");littleC.setFoodShop(new DumplingShop());littleC.work();System.out.println("小明:我要吃披萨!");littleC.setFoodShop(new PizzaShop());littleC.work();}
}/*** 小C* * @author bob*/
public class LittleC {private FoodShop foodShop;public void setFoodShop(FoodShop foodShop){this.foodShop = foodShop;}public void work() {Food food = foodShop.createFood();System.out.print(food.getName() + "做好了!");System.out.println(food.getTaste());}
} public abstract class Food {public abstract String getName();public abstract String getTaste();
}public abstract class FoodShop {public abstract Food createFood();
}public class Bread extends Food {public String getName() {return "面包";}public String getTaste() {return "软软的,很清淡";}
}public class BreadShop extends FoodShop {@Overridepublic Food createFood() {return new Bread();}} 

4.解决了什么,失去了什么

通过引入工厂方法模式我们解决了,Bread硬编码到LittleC中导致的扩展受限问题。小C以后可以接入各种各样的菜色而不需要改动既有代码(world除外)。 
缺点也是很明显,我为了一个菜色还要加一个餐馆进来。这里可以通过带有参数到工厂方法来优化这种情况。创造一个什么菜都可以生产的餐馆,比如根据类型完整名称就可以得到具体的食物,那么只需要一个餐馆就可以了。

5.具体应用场景

所有需要new一个对象的地方,同时要求有足够的灵活性

转载于:https://www.cnblogs.com/bobsha/p/5698082.html

设计模式演练——工厂方法模式相关推荐

  1. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  2. 设计模式复习-工厂方法模式

     设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...

  3. C#设计模式(3)——工厂方法模式

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  4. 设计模式之工厂方法模式(创建型)

    一.模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进行拓展,生产产品的过程由具体工厂类实现,基类只实现接口,这使得工厂方法模式可以在不修改 ...

  5. 设计模式之工厂方法模式应用例题

    设计模式之工厂方法模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReade ...

  6. 设计模式:工厂方法模式(Factory method)

    设计模式:工厂方法模式(Factory method) 一.问题 在前一章中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨. ...

  7. 【设计模式】工厂方法模式(C#)

    [设计模式]工厂方法模式 1.概述 针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则. 定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象.工厂方法使一个产品类的实例化 ...

  8. 一文叫你弄懂Java设计模式之工厂方法模式:图解+日志记录器代码实例

    文章目录 详解Java设计模式之工厂方法模式 案例引入工厂方法模式 工厂方法模式 定义 案例分析 UML类图分析 代码分析 工厂方法的重载 工厂方法的隐藏 模式优点 模式缺点 模式适用环境 详解Jav ...

  9. 设计模式之工厂方法模式(Factory Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  10. 021 设计模式之工厂方法模式,抽象工厂模式的区别

    简单工厂模式,工厂方法模式和抽象工厂模式的异同 简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类.我们掌握一种思想,就是在创建一个对象时,需要把容易发 ...

最新文章

  1. 笔试:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ?(2nd)...
  2. Sharepoint学习笔记 –架构系列—12 Sharepoint的客户端对象模型(Client Object Model)
  3. JDK Unsafe类的使用与CAS原子特性
  4. 属于程序员的等级,看看你是哪个级别?
  5. 就在这段时间让自己充实起来
  6. hdu 1890 Robotic SortI(splay区间旋转操作)
  7. java Google图片验证码_使用google.kaptcha来生成图片验证码的实现方法
  8. html 苹果没有出现弹窗,苹果手机弹窗bug是什么情况?苹果手机为什么会出现弹窗bug要怎么解决?...
  9. 【博学谷学习记录】超强总结,用心分享 | 产品经理电商项目知识点总结与回顾
  10. HUAWEI 机试题:VLAN资源池
  11. 将自己常用的Ubuntu18.04备份为ISO文件,保留私人配置与文件
  12. 谁说Source Insight只能看C盘的文件?我有妙招!
  13. 操作:FTP服务器的搭建
  14. CSAPP 程序人生
  15. 长线、短线在现货黄金中是什么意思的专业术语
  16. 解析大乐透,预测股票信息入库
  17. 程序员访谈_可以用PHP编写出色的应用程序-访谈系列
  18. 电池巡检微信云监控系统——在线监测、故障诊断、预警
  19. html js获取input的值,用JS获取input的输入值
  20. mini2440+jlink+mkd 裸机按键中断调试心得体会(2013.11.17已更新)

热门文章

  1. QQ文件上传不了:什么年代了,还使用简单的关键词过滤,智能一点可好
  2. LINUX编译json-c错误的解决:autoreconf找不到,json_tokener.c报错
  3. linux禁止客户端上传文件_linux 文件服务
  4. mxm智能教育机器人无法智能对话_智能教育机器人与玩具的区别在哪里?
  5. matlab版本和yalmip兼容,科学网—matlab cvx + yalmip - 吴锐的博文
  6. php 大excel,如何用php生成一个大的Excel文件?
  7. 向量机和感知机的相同和不同点_感知机(perceptron)和支持向量机(svm)是一种东西吗? 如果不是那他们的区别和关系是什么?...
  8. 隐马尔可夫模型python_机器学习中的隐马尔科夫模型(HMM)详解
  9. 设置mysql的schema_MySQL Performance-Schema(一) 配置篇
  10. Python开发环境配置 Vim + Ctags+ TagList