X1-2-工厂模式

总目录:地址如下看总纲

https://www.jianshu.com/p/63df8cd03619

前言

傍晚的时候买了几个饼干,心想这个案例就用曲奇饼吧。。
演示工具Spring 推荐的 SpringToolSuite(用起来和eclipse差不多,没有idea的丝滑)

参数、类、图简介

设计思想:一个饼干(Cookies)的加工,需要捏造型(Stereotype),烘焙(baking),上盘(plate),
饼干有草莓口味(strawberryCookie),青草口味(vanillaCookie),可能是澳大利亚制作,可能是丹麦。。。

1、简单工厂模式(也称静态工厂)

简介:

1、简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
2、简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
3、在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式

UML图描述(初学有些丑,还请见谅)


X1-2-工厂模式_第1张图片
image.png

X1-2-工厂模式_第2张图片
image.png

抽象曲奇类


X1-2-工厂模式_第3张图片
image.png

工厂代码

package com.kk.factory.simplefactory.pay;

import com.kk.factory.simplefactory.cookie.Cookies;
import com.kk.factory.simplefactory.cookie.StrawberryCookie;
import com.kk.factory.simplefactory.cookie.VanillaCookie;

// 简单工厂类(静态工厂)
public class SimpleFactory {

    // 传入要买的曲奇类型payType 返回对应的曲奇 对象
    public Cookies createCookies(String payType) {

        Cookies cookie = null;

        System.out.println("这是一个简单工厂模式");
        if ("strawberry".equals(payType)) {
            cookie = new StrawberryCookie();
            cookie.setName("草莓曲奇");
        } else if ("vanilla".equals(payType)) {
            cookie = new VanillaCookie();
            cookie.setName("青草曲奇");
        }
        return cookie;
    }

    // 静态工厂模式写法,就是就加了个static 修饰而已。。
    public static Cookies createCookies2(String payType) {

        Cookies cookie = null;

        System.out.println("这是一个简单工厂模式");
        if ("strawberry".equals(payType)) {
            cookie = new StrawberryCookie();
            cookie.setName("草莓曲奇");
        } else if ("vanilla".equals(payType)) {
            cookie = new VanillaCookie();
            cookie.setName("青草曲奇");
        }
        return cookie;
    }
}

购买方式

package com.kk.factory.simplefactory.pay;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import com.kk.factory.simplefactory.cookie.Cookies;

// 购买曲奇
public class PayCookies {

    // 定义一个简单工厂
    SimpleFactory simpleFactory;

    Cookies cookie;

    // 构造器传入一个工厂
    public PayCookies(SimpleFactory simpleFactory) {
        setFactory(simpleFactory);
    }

    // 传入工厂,调用工厂开始制作饼干
    private void setFactory(SimpleFactory simpleFactory) {
        String payType = ""; // 购买饼干的类型,由用户输入

        this.simpleFactory = simpleFactory;// 设置工厂对象

        while (true) {
            payType = getType();
            // 通过 工厂获取要制作的饼干
            cookie =  this.simpleFactory.createCookies(payType);
            // 开始制作
            if(cookie!=null) {
                cookie.stereotype();
                cookie.baking();
                cookie.plate();
            }
            else {
                System.out.println("曲奇制作失败,无法订购");              
                return;
            }
        }
    }

    // 获取用户订购的 饼干类型
    private String getType() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("请输入你要订购的饼干类型--草莓(strawberry)--青草(vanilla)");
            String cookieType = br.readLine();
            return cookieType;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }

}

购买方式2(静态工厂)

package com.kk.factory.simplefactory.pay;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import com.kk.factory.simplefactory.cookie.Cookies;

// 购买曲奇(使用静态工厂)
public class PayCookies2 {

    String payType = ""; // 购买饼干的类型,由用户输入
    Cookies cookie;
    // 构造器传入一个工厂
    public PayCookies2() {
        setFactory();
    }
    // 传入工厂,调用工厂开始制作饼干
    private void setFactory() {
        while (true) {
            payType = getType();
            // 通过 工厂获取要制作的饼干(指定静态工厂)
            cookie =  SimpleFactory.createCookies2(payType);
            // 开始制作
            if(cookie!=null) {
                cookie.stereotype();
                cookie.baking();
                cookie.plate();
            }
            else {
                System.out.println("曲奇制作失败,无法订购");              
                return;
            }
        }
    }

    // 获取用户订购的 饼干类型
    private String getType() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("请输入你要订购的饼干类型--草莓(strawberry)--青草(vanilla)");
            String cookieType = br.readLine();
            return cookieType;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }

}

测试的客户端

package com.kk.factory.simplefactory.pay;


// 客户端,购买饼干的
public class CookieStore {

    public static void main(String[] args) {
        
        // 客户发起购买曲奇,启动简单工厂模式
        // new PayCookies(new SimpleFactory());
        // 测试静态工厂
        new PayCookies2();
        System.out.println("程序退出,服务结束!");

    }

}

X1-2-工厂模式_第4张图片
image.png

2、工厂方法模式

需求:

简单工厂模式,你可以吃到草莓,青草味的,但是现在你可以吃到不用国家的,又怎么设计呢?
如果用简单工厂,则需要四个 澳大利亚草莓工厂,澳大利亚青草工厂,丹麦草莓。。。
所以工厂方法出来了。。。。

简介:

1、工厂方法模式设计方案:将饼干项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。
2、工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。

UML图:


X1-2-工厂模式_第5张图片
image.png

顶级工厂


X1-2-工厂模式_第6张图片
image.png

丹麦工厂


X1-2-工厂模式_第7张图片
image.png

客户端测试
X1-2-工厂模式_第8张图片
image.png

3、抽象工厂模式(简单工程+工厂方法)

简介:

1、抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
2、从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
3、将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

uml图:


X1-2-工厂模式_第9张图片
image.png

接口:


X1-2-工厂模式_第10张图片
image.png

子工厂:


X1-2-工厂模式_第11张图片
image.png

购买:


X1-2-工厂模式_第12张图片
image.png

测试:


X1-2-工厂模式_第13张图片
image.png

4、在JDK中的日历类(Calendar)的体现

简介:

如果看过源码,你可能会发现,其实Calendar就是用到了简单工厂

源码调试:

步骤一:先出常规使用


X1-2-工厂模式_第14张图片
image.png

步骤二:进入getInstance()


X1-2-工厂模式_第15张图片
image.png

步骤三:核心部分


X1-2-工厂模式_第16张图片
image.png

总结:

如果常规状态,所有类型饼干继承与饼干王,那么抽象饼干王基类发生改变,其他也跟着改变,所以他们中间有了工厂模式
工厂模式的好处:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。

你可能感兴趣的:(X1-2-工厂模式)