• Java设计模式之抽象工厂模式


    1. 抽象工厂模式

    1.1 定义、优缺点、使用场景

    工厂方法模式只考虑生产同种类的产品,但是现实生活中许多工厂是综合型的工厂,能生产多种类的产品。如工厂既生成收集有生成电脑

    抽象工厂模式除了具有工厂方法模式的优点外,其他优点如下

    • 可以在工厂类的内部对多个种类产品共同管理,而不必专门引入多个新的工厂类来进行管理
    • 当需要产品时,抽象工厂可以保证客户端始终只使用同一个工厂的产品组
    • 抽象工厂增强了程序的可扩展性,当增加一个新的工厂时,不需要修改原代码,满足开闭原则

    缺点:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。违法了“开闭原则

    适用场景

    • 当需要创建的对象是一系列相互关联或相互依赖的不同种类产品时,如电器工厂中的电视机、洗衣机、空调等
    • 系统中有多个工厂,但每次只使用其中的某一种类产品。如有人只喜欢穿某一个品牌的衣服和鞋
    • 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构

    1.2 模式的结构与实现

    结构

    • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品
    • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系
    • 抽象工厂(Factory):提供了创建产品的接口,它包含多个创建产品的方法newProduct(),可以创建多个不同种类的产品
    • 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建

    实现

    public class FactoryTest {
    
        public static void main(String[] args) {
    
            // 可以通过配置文件进行类名的配置,然后实例化对应的具体工厂类
            Factory factory = new HuaweiFactory();
            Phone phone = factory.newPhone();
            phone.show();
            Computer computer = factory.newComputer();
            computer.show();
    
        }
    }
    
    // 抽象产品:手机
    interface Phone {
        public void show();
    }
    
    // 具体产品:华为手机
    class HuaweiPhone implements Phone {
        public void show() {
            System.out.println("华为手机显示");
        }
    }
    
    // 具体产品:小米手机
    class XiaomiPhone implements Phone {
        public void show() {
            System.out.println("小米手机显示");
        }
    }
    
    
    // 抽象产品:电脑
    interface Computer {
        public void show();
    }
    
    // 具体产品:华为电脑
    class HuaweiComputer implements Computer {
        public void show() {
            System.out.println("华为电脑显示");
        }
    }
    
    // 具体产品:小米电脑
    class XiaomiComputer implements Computer {
        public void show() {
            System.out.println("小米电脑显示");
        }
    }
    
    // 抽象工厂
    interface Factory {
        public Phone newPhone();
    
        public Computer newComputer();
    }
    
    // 具体工厂:华为工厂
    class HuaweiFactory implements Factory {
        public Phone newPhone() {
            System.out.println("华为工厂生成---华为手机");
            return new HuaweiPhone();
        }
    
        public Computer newComputer() {
            System.out.println("华为工厂生成---华为电脑");
            return new HuaweiComputer();
        }
    }
    
    
    // 具体工厂:小米工厂
    class XiaomiFactory implements Factory {
        public Phone newPhone() {
            System.out.println("小米工厂生成---小米手机");
            return new XiaomiPhone();
        }
    
        public Computer newComputer() {
            System.out.println("小米工厂生成---小米电脑");
            return new XiaomiComputer();
        }
    }
    
    • 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

    运行程序,结果如下:

    华为工厂生成---华为手机
    华为手机显示
    华为工厂生成---华为电脑
    华为电脑显示
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    当酷雷曼VR直播遇上视频号,会摩擦出怎样的火花?
    剑指offer(C++)-JZ61:扑克牌顺子(算法-模拟)
    在线会议中人脸面部轮廓图像提取(三)——Dlib库人脸面部轮廓图像特征提取
    10_12C++
    记一次神奇的SQL查询经历,group by、order by慢查询优化
    HTML5期末考核大作业 基于HTML+CSS+JavaScript沪上美食(9页)
    二苯基环辛炔修饰CulnS2硫铟铜量子点,PbS硫化铅量子点,DBCO-CulnS2 QDs
    Folx Pro Mac中文p破解版如何使用?为您带来Folx Pro 详细使用教程!
    webpack构建工具面试题
    ubuntu18.04编译 BALM
  • 原文地址:https://blog.csdn.net/yy8623977/article/details/126469680