首页 > 其他分享 >(超详细,超易懂)设计模式(三):抽象工厂模式,灵山派系谁上位

(超详细,超易懂)设计模式(三):抽象工厂模式,灵山派系谁上位

时间:2024-06-23 13:31:50浏览次数:3  
标签:派系 具体 创建 模式 工厂 抽象 易懂 设计模式 public

        如果你也喜欢C#开发或者.NET开发,可以关注我,我会一直更新相关内容,并且会是超级详细的教程,只要你有耐心,基本上不会有什么问题,如果有不懂的,也可以私信我加我联系方式,我将毫无保留的将我的经验和技术分享给你,不为其他,只为有更多的人进度代码的世界,而进入代码的世界,最快捷和最容易的就是C#.NET,准备好了,就随我加入代码的世界吧!

案例代码已上传:

https://download.csdn.net/download/Malex2024/89472926icon-default.png?t=N7T8https://download.csdn.net/download/Malex2024/89472926

一、抽象工厂模式简介:

       抽象工厂模式是一种创建型设计模式,它提供了一种封装一组相关对象创建的方式。在抽象工厂模式中,客户端不直接实例化具体的产品,而是通过抽象工厂来创建产品的实例。抽象工厂定义了一组用于创建产品的抽象方法,具体的工厂则实现了这些抽象方法来创建具体的产品。

        抽象工厂模式适用于需要创建一组相关对象的情况,这些对象之间存在一定的约束关系。通过使用抽象工厂模式,可以降低客户端与具体产品之间的耦合度,提高系统的可扩展性和灵活性。

抽象工厂模式由以下几个角色组成:

  1. 抽象工厂(AbstractFactory):定义了一组创建产品的抽象方法。
  2. 具体工厂(ConcreteFactory):实现了抽象工厂定义的抽象方法,用于创建具体产品的实例。
  3. 抽象产品(AbstractProduct):定义了产品的抽象方法。
  4. 具体产品(ConcreteProduct):实现了抽象产品定义的抽象方法,具体的产品。

        使用抽象工厂模式时,首先需要定义一组相关的产品抽象方法,然后实现这些抽象方法的具体产品类。接下来定义一个抽象工厂接口,其中声明了一组用于创建产品的抽象方法。最后,编写具体的工厂类,实现抽象工厂接口,并根据需要创建具体的产品对象。

二、为什么要学习抽象工厂模式:

        2.1 提供了一种良好的代码设计方式:

        抽象工厂模式能够帮助开发者将代码按照一定的组织结构进行划分,提高代码的可读性和可维护性。

        2.2 实现了高内聚低耦合:

        抽象工厂模式能够将相关的类组织在一起,减少类之间的直接依赖关系,使得系统的组件之间更加独立。

        2.3 提供了一种扩展的方式:

        抽象工厂模式通过定义一组接口,可以更方便地扩展新的子类工厂,而不需要修改现有代码。

        2.4 支持产品簇的创建:

        抽象工厂模式可以一次性创建一系列相关的产品对象,而不需要单独创建每个产品对象。

        2.5 便于切换产品簇:

        抽象工厂模式可以通过修改具体工厂的实现,实现对整个产品簇的切换,使得系统更加灵活和可扩展。

三、抽象工厂模式在项目中有哪些实际应用:

        3.1 GUI框架:

        抽象工厂模式可以用于创建不同操作系统的用户界面组件,比如按钮、文本框等。根据当前操作系统的类型,使用不同的具体工厂来创建相应的组件。

        3.2 数据库访问:

        在一个支持多种数据库的系统中,可以使用抽象工厂模式来创建不同数据库的连接对象和操作对象。根据用户配置或者系统环境,选择不同的具体工厂来创建相应的对象。

        3.3 游戏开发:

        在游戏开发中,抽象工厂模式可以用于创建不同类型的角色、武器、道具等。不同的关卡或者游戏模式可以使用不同的具体工厂来创建相应的对象。

        3.4 日志记录:

        在一个支持多种日志记录方式的系统中,可以使用抽象工厂模式来创建不同类型的日志记录器。根据系统配置或者运行环境,选择不同的具体工厂来创建相应的日志记录器。

        3.5 网络通信:

        在一个支持多种网络通信协议的系统中,可以使用抽象工厂模式来创建不同类型的通信对象。根据系统需求或者用户设置,选择不同的具体工厂来创建相应的通信对象。

四、抽象工厂模式的实践:

        背景:灵山这个大集团有两个派系,每个派系都有佛祖和菩萨,分别是如来一派和燃灯一派,如来一派的代表人员有佛祖:如来佛祖,菩萨:文殊菩萨,而燃灯一派的代表人员有佛祖:燃灯古佛,菩萨:观音菩萨,现在需要选择一派来管理灵山,请你用抽象工厂模式设计这个系统;

        4.1 定义抽象产品:佛祖和菩萨

                4.1.1 抽象产品菩萨接口,输出菩萨

/// <summary>
    /// 抽象产品菩萨
    /// </summary>
    public interface Bodhisattva
    {
        /// <summary>
        /// 输出菩萨
        /// </summary>
        void ExportBodhisattva();
    }

                4.1.2 抽象产品佛祖接口,输出佛祖

    /// <summary>
    /// 抽象产品佛祖
    /// </summary>
    public interface Sakyamuni
    {
        /// <summary>
        /// 输出佛祖
        /// </summary>
        void ExportSakyamuni();
    }

        4.2 定义具体产品:生成派系代表

                4.2.1 实现抽象产品佛祖接口

/// <summary>
    /// 具体产品燃灯古佛
    /// </summary>
    public class BurningLampAncientBuddha : Sakyamuni
    {
        /// <summary>
        /// 实现抽象产品中的输出佛祖方法
        /// </summary>
        public void ExportSakyamuni()
        {
            Console.WriteLine("燃灯古佛");
        }
    }
 /// <summary>
    /// 具体产品如来佛祖
    /// </summary>
    public class TathagataBuddha : Sakyamuni
    {
        /// <summary>
        /// 实现抽象产品中的输出佛祖方法
        /// </summary>
        public void ExportSakyamuni()
        {
            Console.WriteLine("如来佛祖");
        }
    }

                4.2.2 实现抽象产品菩萨接口

   /// <summary>
    /// 具体产品观音菩萨
    /// </summary>
    public class Guanyin : Bodhisattva
    {
        /// <summary>
        /// 实现抽象产品中的输出菩萨方法
        /// </summary>
        public void ExportBodhisattva()
        {
            Console.WriteLine("观音菩萨");
        }
    }
 /// <summary>
    /// 具体产品文殊菩萨
    /// </summary>
    public class Wenshu : Bodhisattva
    {
        /// <summary>
        /// 实现抽象产品中的输出菩萨方法
        /// </summary>
        public void ExportBodhisattva()
        {
            Console.WriteLine("文殊菩萨");
        }
    }

        4.3 定义抽象工厂:灵山工厂

 /// <summary>
    /// 灵山工厂接口
    /// </summary>
    public interface LingShanFactory
    {
        /// <summary>
        /// 创建菩萨
        /// </summary>
        /// <returns></returns>
        Bodhisattva CreateBodhisattva();
        /// <summary>
        /// 创建佛祖
        /// </summary>
        /// <returns></returns>
        Sakyamuni CreateSakyamuni();
    }

        4.4 定义具体工厂:生产派系

 /// <summary>
    /// 具体工厂创建古佛派系
    /// </summary>
    public class GufoFactionFactory : LingShanFactory
    {
        /// <summary>
        /// 具体工厂古佛派系的菩萨代表:观音
        /// </summary>
        /// <returns></returns>
        public Bodhisattva CreateBodhisattva()
        {
            return new Guanyin();
        }
        /// <summary>
        /// 具体工厂古佛派系的佛祖代表:燃灯古佛
        /// </summary>
        /// <returns></returns>
        public Sakyamuni CreateSakyamuni()
        {
            return new BurningLampAncientBuddha();
        }
    }
 /// <summary>
    /// 具体工厂创建如来派系
    /// </summary>
    public class RulaiFactionFactory : LingShanFactory
    {
        /// <summary>
        /// 具体工厂如来派系的菩萨代表:文殊
        /// </summary>
        /// <returns></returns>
        public Bodhisattva CreateBodhisattva()
        {
            return new Wenshu();
        }
        /// <summary>
        /// 具体工厂如来派系的佛祖代表:如来佛祖
        /// </summary>
        /// <returns></returns>
        public Sakyamuni CreateSakyamuni()
        {
            return new TathagataBuddha();
        }
    }

        4.3 工厂调用:

                现在想要如来一派上位,输出该派系的佛祖和菩萨代表:

 public class Program
    {
        static void Main(string[] args)
        {
            //灵山现在需要一个派系来掌权
            LingShanFactory factory;
            Sakyamuni sakyamuni;
            Bodhisattva bodhisattva; 
            //选择派系
            factory =new RulaiFactionFactory();
            //创建派系的代表佛祖和菩萨
            sakyamuni= factory.CreateSakyamuni();
            bodhisattva= factory.CreateBodhisattva();
            //输出派系的代表佛祖和菩萨
            sakyamuni.ExportSakyamuni();//代表佛祖
            bodhisattva.ExportBodhisattva();//代表菩萨
        }
    }

                看下运行结果:

                现在改变主意了,想要古佛派系上位,输出古佛派系的代表佛祖和菩萨:

 public class Program
 {
     static void Main(string[] args)
     {
         //灵山现在需要一个派系来掌权
         LingShanFactory factory;
         Sakyamuni sakyamuni;
         Bodhisattva bodhisattva; 
         //选择派系
         factory =new GufoFactionFactory();
         //创建派系的代表佛祖和菩萨
         sakyamuni= factory.CreateSakyamuni();
         bodhisattva= factory.CreateBodhisattva();
         //输出派系的代表佛祖和菩萨
         sakyamuni.ExportSakyamuni();//代表佛祖
         bodhisattva.ExportBodhisattva();//代表菩萨
     }
 }

                查看运行结果:

五、抽象工厂模式的优缺点:

        5.1 抽象工厂模式的优点:

                5.1.1 提供了一种高级别的接口,隐藏了具体类的创建细节,使客户端代码与具体类的实现相分离。

                5.1.2 在一个系统中使用抽象工厂模式可以保证一系列相关对象的一致性,使得它们能够协同工作。

                5.1.3 可以实现类的替换和灵活性,只需更改具体工厂类即可改变整个系统的产品族。

        5.2 抽象工厂模式的缺点:

                5.2.1 增加了系统的复杂度,因为引入了多个工厂接口和多个具体工厂类,需要同时维护它们之间的关系。

                5.2.2 新增加的具体产品需要修改抽象工厂和所有具体工厂类的代码,违反了开闭原则。

                5.2.3 由于抽象工厂模式需要创建多个对象,可能会导致系统的性能下降。

六、使用抽象工厂模式需要注意的地方:

        6.1 明确需求:

        在使用抽象工厂模式之前,需要明确对于对象家族的需求以及其具体实现类的构成。

        6.2 扩展性:

        抽象工厂模式的一个主要优势是其扩展性。当我们需要增加新的产品家族时,只需要新增一个具体工厂类即可。因此,在设计时要考虑到系统的扩展性。

        6.3 一致性:

        抽象工厂模式可以确保创建的产品具有一致性。通过使用同一个具体工厂类,可以确保创建的产品属于同一家族,相互之间是兼容的。

        6.4 可替换性:

        抽象工厂模式使得客户端与具体产品的实现解耦,客户端只需要通过抽象接口来使用产品,而不需要关心具体产品的实现细节。这样,可以方便地替换具体工厂类或者具体产品类,而不影响客户端的代码。

        6.5 遵循开闭原则:

        抽象工厂模式可以帮助我们遵循开闭原则,因为通过增加新的具体工厂类和产品类,我们可以扩展系统的功能而不需要修改已有的代码。

需要注意的是,抽象工厂模式适用于对象家族的创建,如果只需要创建单个对象,可以考虑使用工厂方法模式。另外,抽象工厂模式的实现可能较为复杂,适用于较大规模的系统。在小规模系统中,可能会增加不必要的复杂性。

标签:派系,具体,创建,模式,工厂,抽象,易懂,设计模式,public
From: https://blog.csdn.net/Malex2024/article/details/139897943

相关文章

  • 设计模式之单例模式
          ......
  • 设计模式-中介者模式
    中介者模式(MediatorPattern)中介者模式,又称为调解者模式或者调停者模式。它是用一个中介对象封装一系列的对象交互,使得各对象不需要显示的相互调用,降低耦合性,而且可以独立的改变这些对象之间的交互,属于行为型模式。中介者模式的核心思想是通过中介者对象解耦系统各层次对象的......
  • 设计模式-解释器模式
    解释器模式(InterPreterPattern)解释器模式是指给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子,并按照规定的语法进行解析的模式,属于行为型模式。比如编译器可以将源码编译为机器码,让CPU能进行识别并运行。解释器模式的作用其实与......
  • 设计模式之-代理模式
    代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对其他对象的访问。代理模式主要解决的问题是在某些情况下,直接访问一个对象可能会带来一些问题,比如对象的创建和销毁需要额外的开销,或者需要对对象的访问进行控制和限制。需要使用代理模式的时候,通常有以下情况:对......
  • 设计模式六大原则(一)---单一职责原则
    单一职责原则(SingleResponsibilityPrinciple,SRP)是面向对象设计中的一个原则,它要求一个类或模块应该有且只有一个引起它变化的原因。单一职责原则主要解决的问题是类的职责过于复杂,即一个类承担了过多的责任。当一个类具有多个职责时,任何一个职责的变化都可能影响到其他职责,导致......
  • java设计模式--装饰器模式
    装饰器模式是一种结构型设计模式,它允许你动态地向对象添加额外的行为。装饰器模式通过将对象包装在一个装饰器类中,以提供额外的功能,而不是修改原始对象的结构。装饰器模式主要解决的问题是在不改变现有对象结构的情况下,动态地添加功能或修改行为。它可以避免使用子类继承的方式引......
  • 酱香型白酒派系介绍
    酱香型白酒作为中国传统白酒的重要流派,以其独特的酱香和复杂的酿造工艺而著称。在酱香型白酒中,形成了多个派系,各具特色。以下是关于北派、茅派、川派和黔派等各个派系的详细介绍。一、北派地理位置:主要产于秦岭和淮河以北的地区,如东北、京津冀、山东一带。市场份额:北派酱香......
  • C++设计模式 之 Monostate模式
    目录标题第一章:Monostate模式简介什么是Monostate模式?Monostate模式的工作原理使用Monostate模式的优势适用场景第二章:实现Monostate模式基本结构构造函数和析构函数使用案例总结第三章:Monostate模式的优缺点优点缺点Monostate模式与单例模式的比较第四章:Monostate模......
  • java单例设计模式 , 多例设计模式 , 工厂设计模式概念及详细介绍
    单例设计模式正常情况下一个类可以创建多个对象publicstaticvoidmain(String[]args){ //正常情况下一个类可以创建多个对象 Personp1=newPerson(); Personp2=newPerson(); Personp3=newPerson();}如果说有时一个对象就能搞定的事情,非要创建多......
  • Linux基础命令————浅显易懂的带你了解Linux
    首先,Xshell连接云服务器Linux的语法更接近PowerShellPowerShell和Window命令行都可以对Window操作系统进行操作,但是PowerShell语法更全一些。默认打开这个目录用哪个用户登录的计算机,最后就会到哪个目录下用ls指令可以查看目录下,有哪些文件Windows命令行由于没有这个......