美文网首页
{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#实现设计模式 —— 抽象工厂模式

    本文为转载,原文C#实现设计模式 —— 抽象工厂模式 介绍 定义 抽象工厂模式(Abstract Factory ...

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

    背景 工厂模式也可应用到多类产品,单类产品请参考https://www.jianshu.com/p/09992d0...

  • 设计模式四、抽象工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 抽象工厂模式 ...

  • 单件设计模式

    一、定义 设计模式 设计模式就是一种更好的编写代码方案。 常见设计模式 工厂设计模式、抽象工厂设计模式、抽象工厂设...

  • Android 源码设计模式解析与实战 读书笔记 6 抽象工厂模

    创建型设计模式 —— 抽象工厂模式 1. 抽象工厂模式介绍 抽象工厂模式(Abstract Factory Pat...

  • 常用设计模式

    设计模式 工厂模式 工厂模式思路上分:简单工厂模式,工厂模式, 抽象工厂模式// 抽象工厂模式可以代替工厂模式,做...

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • Go语言设计模式(3)抽象工厂模式

    Go语言设计模式(3)抽象工厂模式 抽象工厂模式的定义 抽象工厂模式的定义如下: Provide an inter...

  • 创建型设计模式

    一 . 工厂模式 二. 抽象工厂设计模式

  • 抽象工厂模式

    抽象工厂设计模式 介绍 抽象工厂设计模式是设计模式中“创建型模式”中的一种,它是用来创建其它工厂的超级工厂。所以该...

网友评论

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

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