{C#}设计模式辨析.抽象工厂

2021-08-03  本文已影响0人  码农猫爸

背景

示例

using static System.Console;

namespace AbstractFactory
{
    // 接口保证互换性,下同
    public interface IPerson { void Introduce(); }

    public class Chinese : IPerson
    {
        public void Introduce() => WriteLine("I am chinese.");
    }

    public class American : IPerson
    {
        public void Introduce() => WriteLine("I am American.");
    }

    public interface ITableWare { void Choose(); }

    public class Chopsticks : ITableWare
    {
        public void Choose() => WriteLine("A pair of chopsticks is chosen.");
    }

    public class Fork : ITableWare
    {
        public void Choose() => WriteLine("A fork is chosen.");
    }

    public interface IFactory
    {
        IPerson Person { get; }
        ITableWare Tableware { get; }

        void Talk(); // 异类产品交互
    }

    public class ChineseFactory : IFactory
    {
        // 绑定具体类到属性而非传参,调用时忽略生成细节
        public IPerson Person => new Chinese();
        public ITableWare Tableware => new Chopsticks();

        public void Talk()
        {
            Person.Introduce();
            Tableware.Choose();
            WriteLine("Chinese people like to use chopsticks.");
            ReadKey();
        }
    }

    public class AmericanFactory : IFactory
    {
        public IPerson Person => new American();
        public ITableWare Tableware => new Fork();

        public void Talk()
        {
            Person.Introduce();
            Tableware.Choose();
            WriteLine("American people like to use fork.");
            ReadKey();
        }
    }

    public class Client
    {
        public void Execute()
        {
            // 改为印度工厂时
            // - 增加IPerson的子类Indian,不影响旧代码
            // - 增加ITableWare的子类Hand,不影响旧代码
            // - 增加IFactory的子类IndianFactory,不影响旧代码
            // - 修改本类中工厂,必须
            var factory = new ChineseFactory();
            factory.Talk();
        }
    }

    class Demo
    {
        static void Main(string[] args)
        {
            var client = new Client();
            client.Execute();
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读