二十三天搞懂设计模式之抽象工厂模式

简介: 二十三天搞懂设计模式之抽象工厂模式

抽象工厂模式

1. 介绍

意图:提供一个创建一系列相关或者依赖的接口,而无需指定他们具体的类

何时使用:系统的产品有多于一个产品族,而系统只消费其中某一族的产品,例子如下

当前有个换装游戏,进入不同的游戏场景需要选择不同的游戏套装,比如,正常的都市套装,里面包含的东西有:

  • 食物:面包
  • 武器:AK47
  • 车辆:宝马

这时候,一个吃着面包、拿着AK47、开着宝马的人物形象就跃然纸上,但是,当我们进入警察局时,如果我们的枪被警察看到,游戏将直接结束。

所以,我们需要进行一键换装,将我们的人物形象转换成吃着棒棒糖、拿着电脑、骑着滑板的形象,这样才可以进入警察局,完成我们的人物,接下来,我们来看下这种如何实现。

2. 实现

我们整体的结构图如下所示:


09faf64651ec40e68b7b56e861dcdf4b.png

我们将武器、食物、车辆封装成各自的抽象类,实现其不同的方法,如:AK47、Computer等

创建一个 AbstractFactory 的抽象工厂,用于生产一类产品族,生产武器、食物、车辆等

对于不同的场景,我们需要定制不同的工厂类

正常人的换装工厂,我们让其返回的是宝马、面包、AK47

警局的换装工厂,我们让其返回的是滑板、棒棒糖、电脑

main 中指定不同的换装工厂,即可完成该需求

3. 代码

  • Weapon:public abstract class Weapon {abstract void shoot();}
  • AK47:public class AK47 extends Weapon {...}
  • Computer:public class Computer extends Weapon {...}

Vehicle:public abstract class Vehicle {abstract void go();}

  • BMW:public class BMW extends Vehicle {...}
  • SkateBoard:public class SkateBoard extends Vehicle {...}
  • Food:public abstract class Food {abstract void printName();}
  • Bread:public class Bread extends Food {...}
  • StickCandy:public class StickCandy extends Food {...}
  • AbstractFactory
/**
 * 抽象工厂
 */
public abstract class AbstractFactory {
    abstract Food createFood();
    // 车辆
    abstract Vehicle createVehicle();
    // 武器
    abstract Weapon createWeapon();
}

CleverFactory

public class CleverFactory  extends AbstractFactory{
    @Override
    Food createFood() {
        return new StickCandy();
    }
    @Override
    Vehicle createVehicle() {
        return new SkateBoard();
    }
    @Override
    Weapon createWeapon() {
        return new Computer();
    }
}

ModerenFactory

public class ModerenFactory extends AbstractFactory {
    @Override
    Food createFood() {
        return new Bread();
    }
    @Override
    Vehicle createVehicle() {
        return new BMW();
    }
    @Override
    Weapon createWeapon() {
        return new AK47();
    }
}

测试类

public class Main {
    public static void main(String[] args) {
        // 正常人走一段时间
        AbstractFactory abstractFactory = new ModerenFactory();
        // 进行赋值
        Vehicle vehicle = abstractFactory.createVehicle();
        Weapon weapon = abstractFactory.createWeapon();
        Food food = abstractFactory.createFood();
        // 走到警局,需要换装
        abstractFactory = new CleverFactory();
        // 进行赋值
        vehicle = abstractFactory.createVehicle();
        weapon = abstractFactory.createWeapon();
        food = abstractFactory.createFood();
    }
}

4. 总结

我们可以看到,通过以上的方式,我们可以瞬间完成服装的转换

我们在进行扩展的时候,也比较方便

假如我当前需要增加一个食物为汉堡,只需要继承我们的 Food 即可

假如我当前需要增加一个食物为汉堡,只需要继承我们的 Food 即可

抽象工厂也存在一定的缺点,当我需要增加一个产品为爱好,需要创建该抽象类,并且在 AbstractFactory 指定,这种扩展不太容易

当然,每一个东西有利必定有弊,我们在进行抽象工厂创建的时候,可以事先规划好这一批产品族的产品,防止后续再进行添加维护

好了,本期的抽象工厂到这里就结束了


相关文章
|
6月前
|
设计模式 PHP
php设计模式--抽象工厂模式(二)
php设计模式--抽象工厂模式(二)
35 0
|
5月前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
32 5
|
6月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
6月前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
61 2
|
2月前
|
设计模式 Java
Java设计模式-抽象工厂模式(5)
Java设计模式-抽象工厂模式(5)
|
6月前
|
设计模式 Java
【设计模式系列笔记】抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种设计模式,属于创建型模式之一。它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过引入抽象的工厂接口,使得客户端代码可以使用抽象的接口来创建一组相关的产品,而不关心这些产品的具体实现。
225 4
|
3月前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
42 1
|
3月前
|
设计模式 XML 存储
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
|
3月前
|
设计模式 Java C语言
设计模式-----------工厂模式之抽象工厂模式(创建型)
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类,从而增强了程序的可扩展性并确保客户端只使用同一产品族的产品。
设计模式-----------工厂模式之抽象工厂模式(创建型)
|
3月前
|
设计模式 存储 XML
[设计模式]创建型模式-抽象工厂模式
[设计模式]创建型模式-抽象工厂模式