美文网首页
{C#}设计模式辨析.抽象工厂

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

作者: 码农猫爸 | 来源:发表于2021-08-03 11:19 被阅读0次

    背景

    • 工厂模式也可应用到多类产品,单类产品请参考https://www.jianshu.com/p/09992d064155
    • 优势:调用时省略了产品的生成细节
    • 要点
      • 接口实现同类产品间和工厂间的互换
      • 具体工厂中绑定多类具体产品,不接受产品传参
      • 多类产品间可交互
    • 与工厂方法的异同
      • 两者均可处理多类产品,但约定抽象工厂处理多类,工厂方法处理单类
      • 具体工厂均绑定了具体产品,抽象工厂不通过方法

    示例

    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();
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:{C#}设计模式辨析.抽象工厂

          本文链接:https://www.haomeiwen.com/subject/dmtuvltx.html