• 【Java 设计模式】创建者模式 之抽象工厂模式


    §1 概念

    在这里插入图片描述

    • 产品族:华为既有华为手机,也有华为电脑、华为平板,华为手机、华为电脑和华为平板属于一个产品族,因为他们都是华为品牌。
    • 产品等级:有华为手机,也有苹果手机、小米手机,他们属于一个产品等级,因为他们都是手机,属于手机等级。
    • 抽象工厂模式和工厂方法模式的区别在于,工厂方法模式中的工厂创建的具体产品属于同一个产品等级,如:咖啡工厂可以制作美式咖啡、拿铁咖啡,但是不能制作甜点;而抽象工厂模式中的工厂创建的具体产品属于同一个产品族,如华为工厂只生产华为手机、华为电脑、华为平板等,不能生产苹果手机、苹果电脑等。

    §2 角色

    • 抽象产品:定义产品的规范,描述产品的特性和功能,抽象工厂模式可能存在多个抽象产品,如:咖啡、甜点等。
    • 具体产品:实现或继承抽象产品的子类,如:咖啡有美式咖啡、拿铁咖啡,甜点有提拉米苏、抹茶慕斯。
    • 抽象工厂:提供创建产品的接口,可以创建不同产品等级的产品,如:甜品工厂既可以制作咖啡,也可以制作甜点。
    • 具体工厂:实现抽象工厂接口,完成对某一个产品族产品的生产,如:美式风味甜品工厂制作美式咖啡和抹茶慕斯,意大利风味甜品工厂制作拿铁咖啡和提拉米苏。

    §3 甜品店案例

    • 某个甜品店,既可以出售咖啡,也可以出售甜点。

    §3.1 类图

    在这里插入图片描述

    §3.2 实现

    // 抽象产品: 咖啡
    public abstract class Coffee {
        public abstract String getName();
        public void getMilk() {
            System.out.println("加牛奶");
        }
        public void addSugar() {
            System.out.println("加糖");
        }
    }
    
    // 抽象产品: 甜点
    public abstract class Dessert {
        public abstract void show();
    }
    
    // 具体产品: 美式咖啡
    public class AmericanCoffee extends Coffee {
        @Override
        public String getName() {
            return "美式咖啡";
        }
    }
    
    // 具体产品: 拿铁咖啡
    public class LatteCoffee extends Coffee {
        @Override
        public String getName() {
            return "拿铁咖啡";
        }
    }
    
    //具体产品: 提拉米苏
    public class Tiramisu extends Dessert {
        @Override
        public void show() {
            System.out.println("提拉米苏");
        }
    }
    
    // 具体产品: 抹茶慕斯
    public class MatchaMousse extends Dessert {
        @Override
        public void show() {
            System.out.println("抹茶慕斯");
        }
    }
    
    // 抽象工厂: 甜品工厂
    public interface DessertFactory {
        Coffee createCoffee();
        Dessert createDessert();
    }
    
    // 具体工厂: 美式风味甜品工厂
    public class AmericanDessertFactory implements DessertFactory {
        @Override
        public Coffee createCoffee() {
            return new AmericanCoffee();
        }
    
        @Override
        public Dessert createDessert() {
            return new MatchaMousse();
        }
    }
    
    // 具体工厂: 意大利风味甜品工厂
    public class ItalyDessertFactory implements DessertFactory {
        @Override
        public Coffee createCoffee() {
            return new LatteCoffee();
        }
    
        @Override
        public Dessert createDessert() {
            return new Tiramisu();
        }
    }
    
    // 客户端
    public class Client {
        public static void main(String[] args) {
            AmericanDessertFactory factory = new AmericanDessertFactory();
            Coffee coffee = factory.createCoffee();
            Dessert dessert = factory.createDessert();
            System.out.println(coffee.getName());
            dessert.show();
            // 可以根据需要创建对应的工厂,获取想要的产品
        }
    }
    /* 输出
    美式咖啡
    抹茶慕斯
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95

    §4 优缺点

    • 优点:保证客户端使用的是同一个产品族的产品。
    • 缺点:当产品族种新增一种产品时,所有的工厂类都需要进行修改。
  • 相关阅读:
    数据库设计
    HC32L110(四) HC32L110的startup启动文件和ld连接脚本
    智慧工地:助力数字建造、智慧建造、安全建造、绿色建造
    Oracle常用对象精解(2)
    HttpContext.TraceIdentifier那严谨的设计
    【反射】Method类
    【.Net实用方法总结】 整理并总结System.IO中StringReader类及其方法介绍
    重新定义每天进步一点点
    (1.1)bark
    SpringMVC(下)
  • 原文地址:https://blog.csdn.net/Coder_Farmer/article/details/128045728