【愚公系列】2021年12月 二十三种设计模式(二)-抽象工厂模式(Abstract Factory Pattern)

简介: 【愚公系列】2021年12月 二十三种设计模式(二)-抽象工厂模式(Abstract Factory Pattern)

文章目录

前言

一、抽象工厂模式(Abstract Factory Pattern)

二、使用步骤

角色

总结

优点

缺点

使用场景

前言

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。


提示:以下是本篇文章正文内容,下面案例可供参考


一、抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式属于创建型模式,为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。


抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。


二、使用步骤

角色

1、抽象工厂(Creator)


是抽象工厂方法模式的核心角色,任何在模式中创建的对象的工厂类必须实现这此产品族接口;


2、具体工厂(Concrete Creator)


这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象;


3、抽象产品(Product)


所要创建的对象的基类,也就是产品对象的共同父类或共同拥有的接口;


4、具体产品(Concrete Product)


这个角色实现了抽象产品角色所定义的接口。


示例

image.png

image.png

命名空间AbstractFactory中包含手机基类MobilePhone、便携式设备基类Tablet和计算机基类Computer,以及它们对应的6个实现类。抽象设备工厂类DeviceFactory包含2个实现类中国工厂ChineseFactory类和美国工厂AmericanFactory类。在智能设备竞争如此激烈的今天,我将尝试用2个不同的工厂来生产一批智能设备,以使大家能够了解抽象工厂模式的正确使用方法。

public abstract class MobilePhone {
    public abstract void Print();
}

抽象手机类MobilePhone,产品族中的一员。

public class ApplePhone : MobilePhone {
    public override void Print() {
        Console.WriteLine("Apple Phone is created by American Factory!");
    }
}

苹果手机实现类ApplePhone,具体的产品。

public class HuaWeiPhone : MobilePhone {
    public override void Print() {
        Console.WriteLine("HuaWei Phone is created by Chinese Factory!");
    }
}

华为手机实现类HuaWeiPhone,具体的产品。

public abstract class Computer {
    public abstract void Print();
}

抽象计算机类Computer,产品族中的一员。

public class DellComputer : Computer {
    public override void Print() {
        Console.WriteLine("Dell Computer is created by American Factory!");
    }
}

戴尔计算机实现类DellComputer,具体的产品。

public class LenovoComputer : Computer {
    public override void Print() {
        Console.WriteLine("Lenovo Computer is created by Chinese Factory!");
    }
}

联想计算机实现类LenovoComputer,具体的产品。

public abstract class Tablet {
    public abstract void Print();
}

抽象便携式设备类Tablet,产品族中的一员。

public class Nexus10 : Tablet {
    public override void Print() {
        Console.WriteLine("Nexus10 is created by American Factory!");
    }
}

Nexus10便携式设备实现类Nexus10,具体的产品。

public class XiaoMiPad : Tablet {
    public override void Print() {
        Console.WriteLine("XiaoMiPad is created by Chinese Factory!");
    }
}

小米平板便携式设备实现类XiaoMiPad,具体的产品。

public abstract class DeviceFactory {
    public abstract MobilePhone CreateMobilePhone();
    public abstract Computer CreateComputer();
    public abstract Tablet CreatePad();
}

智能设备生产工厂基类,它定义了一个产品族的生成接口,这是区别于工厂方法模式的主要模块。

public class AmericanFactory : DeviceFactory {
    public override MobilePhone CreateMobilePhone() {
        return new ApplePhone();
    }
    public override Computer CreateComputer() {
        return new DellComputer();
    }
    public override Tablet CreatePad() {
        return new Nexus10();
    }
}

美国工厂类AmericanFactory,是一个具体的智能设备生产工厂。

public class ChineseFactory : DeviceFactory {
    public override MobilePhone CreateMobilePhone() {
        return new HuaWeiPhone();
    }
    public override Computer CreateComputer() {
        return new LenovoComputer();
    }
    public override Tablet CreatePad() {
        return new XiaoMiPad();
    }
}

中国工厂类ChineseFactory,是一个具体的智能设备生产工厂。

public class CreateDevice<T> where T : DeviceFactory {
    private static T _deviceFactory = null;
    public static void Create() {
        _deviceFactory = Activator.CreateInstance<T>();
        _deviceFactory.CreateMobilePhone().Print();
        _deviceFactory.CreateComputer().Print();
        _deviceFactory.CreatePad().Print();
    }
}

一个辅助类,帮助我生产智能设备并向命令行输出结果。

public class Program {
    public static void Main(string[] args) {
        CreateDevice<ChineseFactory>.Create();
        CreateDevice<AmericanFactory>.Create();
        Console.ReadKey();
    }
}

以上是调用方的代码,以下是这个案例的输出结果:

HuaWei Phone is created by Chinese Factory!
Lenovo Computer is created by Chinese Factory!
XiaoMiPad is created by Chinese Factory!
Apple Phone is created by American Factory!
Dell Computer is created by American Factory!
Nexus10 is created by American Factory!

总结

优点

1、能够从多个产品族的多个产品中,简洁的获取想要的具体产品;

2、解决了工厂模式中的不符合开闭原则的问题。


缺点

1、产品族扩展比较困难,要增加一个系列的某一产品,要增加具体的产品类,还要增加对应的工厂类。


使用场景

1、一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提;

2、这个系统有多个系列产品,而系统中只消费其中某一系列产品;

3、系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。



相关文章
|
3月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
3月前
|
设计模式 Java
Java设计模式-抽象工厂模式(5)
Java设计模式-抽象工厂模式(5)
|
3月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
4月前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
43 1
|
4月前
|
设计模式 XML 存储
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
|
4月前
|
设计模式 Java C语言
设计模式-----------工厂模式之抽象工厂模式(创建型)
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类,从而增强了程序的可扩展性并确保客户端只使用同一产品族的产品。
设计模式-----------工厂模式之抽象工厂模式(创建型)
|
4月前
|
设计模式 存储 XML
[设计模式]创建型模式-抽象工厂模式
[设计模式]创建型模式-抽象工厂模式
|
6月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。