设计模式-抽象工厂模式

抽象工厂模式-简介

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

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

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

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

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

为什么需要抽象工厂模式

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

产品等级 和 产品族

举例说明:

  • 电视机有 海尔电视机、长虹电视机、TCL电视机… 它们就属于同一个产品等级。
  • (海尔电视机、海尔冰箱、海尔空调…) 、(长虹电视机、长虹冰箱、长虹空调…) 每个括号内代表一个产品族。
    设计模式-抽象工厂模式_第1张图片
    再举一个简单通俗易懂的例子:
    同一个产品等级的东西一定是继承于同一个类,并且处于同一个继承等级的,比如 海尔电视机、长虹电视机 都是 继承于 电视机 这个父类。

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

抽象工厂模式 - 代码示例

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

设计模式-抽象工厂模式_第2张图片

修改代码如下:

/**
 *  定义抽象工厂,甜品类
 */
public interface DessertFactory {
    Coffee getCoffee();
    Cake getCake();
}
/**
 *  定义American口味工厂
 */
public class AmericanFactory implements DessertFactory{
    @Override
    public Coffee getCoffee() {
        return new AmericanCoffee();
    }

    @Override
    public Cake getCake() {
        return new AmericanCake();
    }
}
/**
 *  定义Latte口味工厂
 */
public class LatteFactory implements DessertFactory{
    @Override
    public Coffee getCoffee() {
        return new LatteCoffee();
    }

    @Override
    public Cake getCake() {
        return new LatteCake();
    }
}
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();
    }
}

主函数:

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();
    }
}

说明:

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

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

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

你可能感兴趣的:(设计模式,设计模式,抽象工厂模式,java)