设计模式成长记(一) 抽象工厂模式(Abstract Factory)

时间:2022-05-06
本文章向大家介绍设计模式成长记(一) 抽象工厂模式(Abstract Factory),主要内容包括目录、定义、UML类图、参与者、编写代码、特点、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

目录

  • 定义
  • UML类图
  • 参与者
  • 编写代码
  • 特点

定义

提供一个创建一系列相关或相互依赖的对象的接口,而无需指定具体的类。

使用频率:

UML类图

参与者

AbstractFactory:声明一个创建抽象产品的的接口。

ConcreteFactory:实现接口创建具体的产品对象。

AbstractProduct:产品的抽象。

Product:具体的产品,实现抽象产品的接口。

Client:使用抽象工厂和抽象产品。

编写代码

1.新建控制台程序AbstractFactory,新增Abstract.cs类文件

using System;


/// <summary>
/// 抽象工程模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定具体的类。
/// </summary>
namespace AbstractFactory
{
    /// <summary>
    /// 抽象产品A
    /// </summary>
    public abstract class AbstractProductA
    {
        public abstract void SayHello();
    }

    /// <summary>
    /// 抽象产品B
    /// </summary>
    public abstract class AbstractProductB
    {
        public abstract void SayHello();
    }

    /// <summary>
    /// 具体产品A1
    /// </summary>
    public class ProductA1 : AbstractProductA
    {
        public override void SayHello()
        {
            Console.WriteLine("Hello,我是具体产品A1");
        }
    }

    /// <summary>
    /// 具体产品A2
    /// </summary>
    public class ProductA2 : AbstractProductA
    {

        public override void SayHello()
        {
            Console.WriteLine("Hello,我是具体产品A2");
        }
    }

    /// <summary>
    /// 具体产品B1
    /// </summary>
    public class ProductB1 : AbstractProductB
    {
        public override void SayHello()
        {
            Console.WriteLine("Hello,我是具体产品B1");
        }
    }

    /// <summary>
    /// 具体产品B2
    /// </summary>
    public class ProductB2 : AbstractProductB
    {
        public override void SayHello()
        {
            Console.WriteLine("Hello,我是具体产品B2");
        }
    }

    /// <summary>
    /// 抽象工厂:提供创建抽象产品的接口
    /// </summary>
    public abstract class AbstractFactory
    {
        public abstract AbstractProductA CreateProductA();
        public abstract AbstractProductB CreateProductB();
    }

    /// <summary>
    /// 具体工厂:实现抽象工厂创建产品的接口
    /// </summary>
    public class ConcreteFactory1 : AbstractFactory
    {
        public override AbstractProductA CreateProductA()
        {
            return new ProductA1();
        }

        public override AbstractProductB CreateProductB()
        {
            return new ProductB1();
        }
    }


    public class ConcreteFactory2 : AbstractFactory
    {
        public override AbstractProductA CreateProductA()
        {
            return new ProductA2();
        }

        public override AbstractProductB CreateProductB()
        {
            return new ProductB2();
        }
    }

    public class Client
    {
        private AbstractProductA _productA;
        private AbstractProductB _productB;

        public Client(AbstractFactory factory)
        {
            _productA = factory.CreateProductA();
            _productB = factory.CreateProductB();
        }

        public void Run()
        {
            _productA.SayHello();
            _productB.SayHello();
        }
    }
}

2.编写Program.cs

using System;

namespace AbstractFactory
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用工厂1
            AbstractFactory factory = new ConcreteFactory1();
            Client client = new Client(factory);//依赖注入
            client.Run();

            Console.WriteLine();

            //使用工厂2
            factory = new ConcreteFactory2();
            client = new Client(factory);
            client.Run();

            Console.Read();
        }
    }

  
}

3.输出结果

特点

1) 分离了具体的类

Abstract Factory 模式帮助你控制一个应用创建的对象的类。因为一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离;它们不出现在客户代码中。

2) 使得易于交换产品系列 一个具体工厂类在一个应用中仅出现一次—即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。

3) 有利于产品的一致性

当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要。而AbstractFactory很容易实现这一点。

4) 难以支持新种类的产品

难以扩展抽象工厂以生产新种类的产品,这是因为AbstractFactory接口确定了可以被创建的产品集合。 支持新种类的产品就需要扩展该工厂接口,这将涉及 AbstractFactory类及其所有子类的改变。