设计模式(四):《Head First设计模式》工厂模式之简单工厂

前言

本文是对工厂模式中的简单工厂的学习笔记,如有错误请指正~

简单工厂不是设计模式,更像是一种编程习惯,是学习工厂模式的热身运动。理解了简单工厂,工厂模式的学习将水到渠成。

工厂的目标

所有的设计模式都是为了解决变化的问题,着力点在“封装变化点”。

工厂模式解决的问题是:实例化不应该总是公开地进行、初始化经常会造成耦合问题

所有的工厂模式都用来封装对象的创建。简单来讲就是将实例化的过程放在一个地方管理,将产品的“实现”从”使用“中解耦。这样客户的实例化代码就可以删掉了

概念

工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类

抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类

依赖倒置原则:要依赖抽象,不要依赖具体类。

简单工厂Demo

你要开一家煎饼果子连锁店,目前包含正宗的临沂煎饼果子(放果子的那种)和枣庄菜煎饼(好多菜的那种)

煎饼果子商店

public class JBGZStore {

    SimpleJBGZFactory factory;
    
    public JBGZStore(SimpleJBGZFactory factory) {
        this.factory = factory;
    }
    
    public Jianbingguozi orderJBGZ(String type) {
        Jianbingguozi jbgz;
        jbgz = factory.createJBGZ(type);
        jbgz.prepare();
        jbgz.make();
        jbgz.cut();
        return jbgz;
    }
}

煎饼果子制作工厂

public class SimpleJBGZFactory {

    public Jianbingguozi createJBGZ(String type) {
        Jianbingguozi jianbingguozi = null;
        if("正宗临沂煎饼果子".equals(type)) {
            jianbingguozi = new LinyiJBGZ();
        }else if("枣庄菜煎饼".equals(type)) {
            jianbingguozi = new Zaozhuangcaijianbing();
        }
        return jianbingguozi;
    }
}

煎饼果子的抽象类

public abstract class Jianbingguozi {

    String name;
    // 加什么
    ArrayList<String> adders = new ArrayList<>(8);
    
    void prepare() {
        printf("开始准备制作" + name + "……");
        for(int i = 0; i < adders.size();i++) {
            printf("放 " + adders.get(i));
        }
    }
    
    // 正常的煎饼果子制作是一样的
    void make() {
        printf("制作煎饼");
    }
    
    // 是否需要拦腰切断
    void cut() {
        printf("不需要切开");
    }
    
    private void printf(String str) {
        System.out.println(str);
    }
}

临沂煎饼果子

public class LinyiJBGZ extends Jianbingguozi{

    public LinyiJBGZ() {
        super.name = "临沂煎饼果子";
        super.adders.add("果子");
        super.adders.add("鸡蛋");
    }
    
}

枣庄菜煎饼

public class Zaozhuangcaijianbing extends Jianbingguozi{

    public Zaozhuangcaijianbing() {
        super.name = "枣庄菜煎饼";
        super.adders.add("生菜");
        super.adders.add("鸡蛋");
        super.adders.add("火腿肠");
        super.adders.add("白菜");
        super.adders.add("粉条");
    }

    @Override
    void cut() {
        System.out.println("枣庄菜煎饼会从中间切开");
    }
}

Demo解析

上面的Demo就是一个简单的煎饼果子制作工厂,以后再上其他种类的煎饼果子只需要修改SimpleJBGZFactory即可。

如果不使用工厂:
我们的煎饼果子产业规模扩大了,有了很多加盟店,每个商店可以制作煎饼果子,总店研究出什么类别的煎饼果子加盟店就做什么。如果新增一个煎饼果子种类(比如加糖的煎饼果子,有种黑暗料理的感觉。。)那么每个加盟店的都需要新增一个种类判断,改动的地方非常多。

上面存在的问题就是已有煎饼果子的优化和新增煎饼果子,所有的加盟店都必须修改,成本会非常高。严重限制了我们煎饼果子大业的发展。

煎饼果子工厂存在的意义是将变化和扩展都统一管理了。新增煎饼果子种类只需要新增一个子类TianJBGZ,然后在SimpleJBGZFactory中加一个判断if("甜口菜煎饼".equals(type)即可,至于加盟店不需要做太多变化,只需要广告牌上加上”本店新上甜党最爱的甜口煎饼果子“

猜你喜欢

转载自blog.csdn.net/weixin_33862188/article/details/87196239
今日推荐