• 设计模式-抽象工厂模式


    抽象工厂模式-简介

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式

    在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

    抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。

    抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的形态,它和普通的工厂模式的区别在于

    • 工厂模式针对的是同一个产品等级结构。
    • 抽象工厂模式针对的是多个产品等级结构。
    • 一个工厂等级结构可以负责多个不同产品等级结构中的对象创建。

    为什么需要抽象工厂模式

    • 系统的产品有多余一个的产品族,而系统只消费其中某一族的产品。

    产品等级 和 产品族

    举例说明:

    • 电视机有 海尔电视机、长虹电视机、TCL电视机… 它们就属于同一个产品等级。
    • (海尔电视机、海尔冰箱、海尔空调…) 、(长虹电视机、长虹冰箱、长虹空调…) 每个括号内代表一个产品族。
      在这里插入图片描述
      再举一个简单通俗易懂的例子:
      同一个产品等级的东西一定是继承于同一个类,并且处于同一个继承等级的,比如 海尔电视机、长虹电视机 都是 继承于 电视机 这个父类。

    产品族可以理解为就是 同一个品牌下 的不同东西,比如 海尔电视机 海尔空调 海尔冰箱。

    抽象工厂模式 - 代码示例

    让我们再回到工厂模式的那个咖啡店的例子。
    随着咖啡店的顾客越来越多,咖啡店慢慢的需要进行升级,老板最终决定将咖啡店升级为 甜品店,不仅仅卖 Coffee(AmericanCoffee、LatteCoffee),还卖 Cake(AmericanCake、LatteCake),那这个时候,我们再回到之前工厂方法模式的代码。

    在这里插入图片描述

    修改代码如下:

    /**
     *  定义抽象工厂,甜品类
     */
    public interface DessertFactory {
        Coffee getCoffee();
        Cake getCake();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    /**
     *  定义American口味工厂
     */
    public class AmericanFactory implements DessertFactory{
        @Override
        public Coffee getCoffee() {
            return new AmericanCoffee();
        }
    
        @Override
        public Cake getCake() {
            return new AmericanCake();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    /**
     *  定义Latte口味工厂
     */
    public class LatteFactory implements DessertFactory{
        @Override
        public Coffee getCoffee() {
            return new LatteCoffee();
        }
    
        @Override
        public Cake getCake() {
            return new LatteCake();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    public class CoffeeStore {
        private DessertFactory dessertFactory;
        public void setCoffeeFactory(DessertFactory dessertFactory) {
            this.dessertFactory = dessertFactory;
        }
        public Coffee produceCoffee() {
            return dessertFactory.getCoffee();
        }
        public Cake produceCake() {
            return dessertFactory.getCake();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    主函数:

    public class Main {
        public static void main(String[] args) {
            CoffeeStore coffeeStore = new CoffeeStore();
            // DessertFactory dessertFactory = new AmericanFactory();
            DessertFactory dessertFactory = new LatteFactory();
            coffeeStore.setCoffeeFactory(dessertFactory);
            Coffee coffee = coffeeStore.produceCoffee();
            Cake cake = dessertFactory.getCake();
            coffee.getName();
            cake.getName();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    说明:

    • 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体
      工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。
      当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。

    • 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

    • 当抽象工厂模式中每一个具体工厂类只创建一个产品对象,也就是只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式;当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式退化成简单工厂模式

  • 相关阅读:
    卷麻了,00后测试用例写的比我还好,简直无地自容。。。
    统信UOS升级Python3及安装spyder5
    微信小程序使用路由传参和传对象的方法
    DT科幻建筑建模
    前端开发从 0 到 1 掌握 docker
    SpringMVC07-RESTful
    什么是hive的静态分区和动态分区,hive动态分区详解
    高等数学(第七版)同济大学 总习题四(前半部分) 个人解答
    在英国招生官眼中,对A-Level、IB和AP成绩认可度是多少?
    HTML5期末大作业:游戏网站设计与实现——基于bootstrap响应式游戏资讯网站制作HTML+CSS+JavaScript
  • 原文地址:https://blog.csdn.net/qq_43513394/article/details/133813366