《设计模式(四)之——工厂模式》

迈不过友情╰ 2022-12-23 03:22 220阅读 0赞

一、情景:

上一篇老王的装饰者模式在卖煎饼已觉得没有发展前景了,一天突然做决定说要开一家面包店。他想制作一个能够自动制作面包的,面包机器,这样一来只要把面粉倒进去,然后设置不同的按钮,就能制作出不同的面包啦。老王美滋滋的想着,下面的情景。
在这里插入图片描述


二、情景后续:

老王又来求设计模式大佬了,来咨询制作面包机器的方法,大佬推荐了一种工厂方法的设计模式

在这里插入图片描述


三、工厂模式(Factory)

  • 定义:定义了一个创建对象的接口,但由子类决定要实例化但类是哪一个。工厂方法把实例化退迟到子类
  • 重要组件
  • Product 定义工厂方法所创建的对象接口
  • ConcreteProduct 具体的产品
  • Fectory 工厂接口,里面定义了生产Product方法
  • ConcreteCreator 具体的工厂方法,返回生产具体的产品。
    在这里插入图片描述

四、代码演示

4.1 定义面包接口 Ibread
  1. /** * @author liuzihao * @create 2020-11-22-11:13 * 面包接口 */
  2. public interface Ibread {
  3. /** * 描述 * @return */
  4. String desc();
  5. }
4.2具体的面包实现
  1. /** * @author liuzihao * @create 2020-11-22-11:15 */
  2. public class Breakbread implements Ibread {
  3. @Override
  4. public String desc() {
  5. return "黑面包";
  6. }
  7. }
  8. public class BuckWheaBread implements Ibread {
  9. @Override
  10. public String desc() {
  11. return "荞麦面包";
  12. }
  13. }
4.3 定义工厂方法
  1. /** * @author liuzihao * @create 2020-11-22-11:16 * 工厂接口,用于生产面包 */
  2. public interface IFactory {
  3. /** * 创建一个面包 * @return */
  4. Ibread createBread();
  5. }
4.4 黑面包按钮、荞麦面包按钮
  1. /** * @author liuzihao * @create 2020-11-22-11:18 * 黑面包按钮,用于生产黑面包 */
  2. public class BreakBreadButtonFactory implements IFactory {
  3. @Override
  4. public Ibread createBread() {
  5. return new Breakbread();
  6. }
  7. }
  8. /** * @author liuzihao * @create 2020-11-22-11:20 * 荞麦面包按钮,用于生产荞麦面包 */
  9. public class BuckWheaBreadButtonFactory implements IFactory {
  10. @Override
  11. public Ibread createBread() {
  12. return new BuckWheaBread();
  13. }
  14. }

制作不同面包的 控制按钮已经制作好了,可以测试一下

  1. /** * @author liuzihao * @create 2020-11-22-11:29 */
  2. public class DemoTest {
  3. public static void main(String[] args) {
  4. // 生产黑面包
  5. IFactory iFactory = new BreakBreadButtonFactory();
  6. Ibread breakBread = iFactory.createBread();
  7. System.out.println(breakBread.desc());
  8. // 生产荞麦面包
  9. IFactory factory = new BuckWheaBreadButtonFactory();
  10. Ibread buck = factory.createBread();
  11. System.out.println(buck.desc());
  12. }
  13. }

在这里插入图片描述
这样两个按钮就可以成功制作出不同的面包啦。只要把这两个按钮安装到面包机上就可以啦

五、小结

工厂方法 满足开发密闭原则,他就是针对下面讲的简单工厂方法的一种改进。

六、番外,谈谈大家说的简单工厂

这里说的简单工厂,也可以叫静态工厂吧,具体是根据类型,然后采用switch方法,返回不同的生产对象,代码如下:

  1. public Ibread create(String type) {
  2. switch (type) {
  3. case "1":
  4. return new Breakbread();
  5. case "2":
  6. return new BuckWheaBread();
  7. default:
  8. throw new RuntimeException("不支持改类型");
  9. }
  10. }

其实上面设置 并不能成设计模式中的一种,更像是一种编码习惯,因为方便,很多程序员都喜欢用它,慢慢的也就被大家称为设计模式了

上面这种方式,最大的缺点就是 如果新增加一个类型的面包,那就就需要修改工厂方法,这违背了 开放密闭原则。所以改进方法就是我们今天介绍的,工厂方法,方法工厂方法也有他的缺点,比如生产的产品单一,假如老王又想推出一款 能制作冰淇淋的机器那该怎么办呢,

  • 当然可以再像面包机器一样 制作一台。但是这样太麻烦啦,老王的店面都不够摆放了
  • 或者能不能将机器进行改进,能生产面包和冰淇淋这种一系列产品族呢,那就就是下一篇介绍的,抽象工厂方法了

发表评论

表情:
评论列表 (有 0 条评论,220人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式工厂模式

    工厂模式 属于创建型模式,它提供了一种创建对象的最佳方式。需要生成的对象叫做产品 ,生成对象的地方叫做工厂 。 场景: 解耦合,提高代码灵活性和可扩展性。

    相关 设计模式工厂方法模式

    这个设计模式是由简单的简单工厂模式抽象化而来,怎么说呢,就是把工厂抽象成一个接口,具体的生产方法放到具体的工厂实现类里实现,这样就满足了开闭原则的对修改关闭,对拓展开发了。

    相关 设计模式工厂模式

    模式描述:提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个产品类,并且由该实现类创建对应的产品实例。 工厂方法模式: 一个抽象产品类,可以派

    相关 设计模式工厂模式

    设计模式--工厂模式 在软件系统中,经常面临着“某个对象”由于需求的变化,对象的具体实现面临着剧烈的变化。为了应对这种变化我们抽象出它比较稳定的接口,隔离出“这个易变对象