设计模式实例与代码:Abstract Factory模式

本文探讨了如何通过工厂模式为特定客户提供一组相关对象的实例化过程,阐述了抽象工厂、具体工厂、产品接口及其实现之间的协作关系,以及如何通过这种方式将对象创建规则与对象使用逻辑分离。以肯德基和麦当劳为例,展示了如何通过不同工厂创建多种食品,体现了模式在实际应用中的灵活性和复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

意图/定义:需要为特定的客户提供对象组

问题:需要实例化一组相关的对象

解决方案:协调对象组的创建。撮合 种方法,将如何执行对象实例化的规则从使用这些对象的客户对象中提取出来

参与者与协作者:AbstractFactory为如何创建对象组的每个成员定义接口。通常每个组都独立的ConcreteFactory来创建

效果:这个模式将"使用哪些对象的规则"与"如何使用这些对象"的逻辑分离开来

实现:定义一个抽象类来指定创建哪些对象。然后为每个组实现一个具体类。可以用表或文件完成同样的任务。




示例代码:我们继续上次工厂方法中举的肯德基和麦当劳的例子,客户去快餐店,并不只吃一种,可能吃多种如薯片、汉堡、炸鸡等,客户去到不同的快餐店就能吃到此快餐店所生产的所有食物。

using System;

namespace AbstractFactory
{
    /// <summary>
    /// MainApp startup class for Structural
    /// Abstract Factory Design Pattern.
    /// </summary>
    class MainApp
    {
        /// <summary>
        /// Entry point into console application.
        /// </summary>
        public static void Main()
        {
            // Abstract factory #1
            AbstractFactory factory1 = new KFC_Factory();
            Client client1 = new Client(factory1);
            client1.Run();

            // Abstract factory #2
            AbstractFactory factory2 = new MD_Factory();
            Client client2 = new Client(factory2);
            client2.Run();

            // Wait for user input
            Console.ReadKey();
        }
    }

    /// <summary>
    /// The 'AbstractFactory' abstract class
    /// </summary>
    abstract class AbstractFactory
    {
        public abstract Chips     CreateProductChips();
        public abstract Hamburg   CreateProductHamburg();
        public abstract Cola      CreateProductCola();
    }


    /// <summary>
    /// The 'ConcreteFactory1' class
    /// </summary>
    class KFC_Factory : AbstractFactory
    {
        public override Chips CreateProductChips()
        {
            return new KFC_Chips();
        }
        public override Hamburg CreateProductHamburg()
        {
            return new KFC_Hamburg();
        }
        public override Cola CreateProductCola()
        {
            return new CocaCola();
        }
    }

    /// <summary>
    /// The 'ConcreteFactory2' class
    /// </summary>
    class MD_Factory : AbstractFactory
    {
        public override Chips CreateProductChips()
        {
            return new MD_Chips();
        }
        public override Hamburg CreateProductHamburg()
        {
            return new MD_Hamburg();
        }

        public override Cola CreateProductCola()
        {
            return new PepsiCola();
        }
    }

    /// <summary>
    /// The 'AbstractProductA' abstract class
    /// </summary>
    abstract class Chips
    {
    }

    /// <summary>
    /// The 'AbstractProductB' abstract class
    /// </summary>
    abstract class Hamburg
    {
        public abstract void Interact(Chips a,Cola b);
    }

    /// <summary>
    /// The 'AbstractProductC' abstract class
    /// </summary>
    abstract class Cola
    {
    }

    /// <summary>
    /// The 'ProductA1' class
    /// </summary>
    class KFC_Chips : Chips
    {
    }

    /// <summary>
    /// The 'ProductB1' class
    /// </summary>
    class KFC_Hamburg : Hamburg
    {
        public override void Interact(Chips a, Cola b)
        {
            Console.WriteLine(this.GetType().Name +
                " interacts with " + a.GetType().Name + " and " + b.GetType().Name);
        }
    }

    /// <summary>
    /// The 'ProductC1' class
    /// </summary>
    class CocaCola : Cola
    {
    }

    /// <summary>
    /// The 'ProductA2' class
    /// </summary>
    class MD_Chips : Chips
    {
    }

    /// <summary>
    /// The 'ProductB2' class
    /// </summary>
    class MD_Hamburg : Hamburg
    {
        public override void Interact(Chips a,Cola b)
        {
            Console.WriteLine(this.GetType().Name +
                " interacts with " + a.GetType().Name + " and "+b.GetType().Name);
        }
    }


    /// <summary>
    /// The 'ProductC2' class
    /// </summary>
    class PepsiCola : Cola
    {
    }


    /// <summary>
    /// The 'Client' class. Interaction environment for the products.
    /// </summary>
    class Client
    {
        private Chips   _chips;
        private Hamburg _hamberg;
        private Cola    _cola;


        // Constructor
        public Client(AbstractFactory factory)
        {
            _chips = factory.CreateProductChips();
            _hamberg = factory.CreateProductHamburg();
            _cola = factory.CreateProductCola();
        }

        public void Run()
        {
            _hamberg.Interact(_chips, _cola);
        }
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值