程序员的知识教程库

网站首页 > 教程分享 正文

常用设计模式--抽象工厂模式(抽象工厂模式应用)

henian88 2024-10-18 05:58:05 教程分享 2 ℃ 0 评论

抽象工厂模式

定义

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

作用

在工厂方法模式中,我们的具体创建者每次使用都只能创建一个同类型的对象,假如我们现在需要的是多个不同类型的对象,工厂方法就满足不了需求了。这时我们可以把多个工厂方法组合到一个类,这就是抽象工厂模式,它就是专门用来创建多个产品,也可以说是创建产品家族的。

优点

  1. 允许客户使用抽象的接口创建一组相关产品,而不需要知道(或者关心)产出的具体产品是什么,这样客户就可以从具体的产品中解耦出来。
  2. 一个具体工厂可以创建多个产品,与工厂方法模式相比,可以少产生具体工厂的类数量。
  3. 易于交换产品系列,只要更换具体工厂,就可以改变这个产品系列。

缺点

  1. 抽象工厂是使用组合的方式把工厂方法集合到一个类中,当新增一个产品家族成员时就要修改抽象工厂类及其下面的具体工厂类,所以它的扩展性比较差。
  2. 每新增一个产品子类都要创建一个类,当产品子类过多时会产生很多类,导致系统复杂性加大。

使用场景

  1. 当需要创建产品家族,或者需要想让创建的产品集合起来时使用。
  2. 当系列产品不固定,在以后可能会增加整个系列产品时使用。

结构讲解

代码说明:

抽象工厂类包含所有产品创建的抽象方法。

abstract class AbstractFactory
{
    public abstract AbstractProductA CreateProductA();
    public abstract AbstractProductB CreateProductB();
}

具体的工厂实现特定产品对象。通常在运行时创建ConcreteFactory类的实例。因此,客户端可以通过使用不同的具体工厂实现创建不同的产品对象。

class ConcreteFactory1 : AbstractFactory
{
    public override AbstractProductA CreateProductA()
    {
        return new ProductA1();
    }
    public override AbstractProductB CreateProductB()
    {
        return new ProductB1();
    }
}

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

抽象产品类

//
abstract class AbstractProductA
{
}

abstract class AbstractProductB
{
    public abstract void Interact(AbstractProductA a);
}

具体产品实现类,继承抽象产品类,实现具体产品的方法

class ProductA1 : AbstractProductA
{
}

class ProductB1 : AbstractProductB
{
    public override void Interact(AbstractProductA a)
    {
        Console.WriteLine(this.GetType().Name +
            " interacts with " + a.GetType().Name);
    }
}

class ProductA2 : AbstractProductA
{
}

class ProductB2 : AbstractProductB
{
    public override void Interact(AbstractProductA a)
    {
        Console.WriteLine(this.GetType().Name +
            " interacts with " + a.GetType().Name);
    }
}

客户端类

class Client
{
    private AbstractProductA AbstractProductA;
    private AbstractProductB AbstractProductB;

    // Constructor 
    public Client(AbstractFactory factory)
    {
        AbstractProductB = factory.CreateProductB();
        AbstractProductA = factory.CreateProductA();
    }

    public void Run()
    {
        AbstractProductB.Interact(AbstractProductA);
    }
}

客户端调用

AbstractFactory factory1 = new ConcreteFactory1();
Client c1 = new Client(factory1);
c1.Run();

AbstractFactory factory2 = new ConcreteFactory2();
Client c2 = new Client(factory2);
c2.Run();

Console.Read();

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表