【23种GOF设计模式】C#代码完整案例详解--简单工厂

来自:CCNetCore社区,一个关注.Netcore领域的社区团队。

简单工厂SimpleFactory

简单工厂SimpleFactory 创建型设计模式

创建对象交由工厂的方法完成,通过枚举switch来进行判断创建什么对象。
在一个简单工厂类中会实例化多个具体对象,其实也进行了高度耦合。
那么创建对象可有以下方式:

枚举,switch判断直接new实例化
从配置文件中获取字符串,通过反射进行实例化对象
注意:该简单工厂方法并未被23种GOF收录

Program.cs

using FactoryPattern.War3.Interface;
using FactoryPattern.War3.Service;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleFactory
{
   /// <summary>
   /// 1 依赖倒置原则,SimpleFactory
   /// 2 简单工厂+ 配置文件=可配置
   /// 3 简单工厂+ 配置文件+反射=可配置可扩展
   /// 4 简单工厂升级IOC控制反转
   /// 
   /// 备战2019跳槽季,设计模式再来一波
   /// 设计模式:面向对象语言开发过程中,遇到种种的场景和问题,提出解决方案和思路,沉淀下来
   ///           前辈的智慧,是解决问题的套路,学习设计模式就是为了站在前辈的肩膀上
   /// 结构型设计模式(装饰器):关注类与类之间的关系
   /// 行为型设计模式(责任链):关注对象和行为的分离
   /// 创建型设计模式(三大工厂):关注对象的创建         
   /// 学习设计模式的套路:
   ///     场景出发---解决问题---沉淀总结---推广应用(无尽升级)
   /// 
   /// 依赖倒置原则:上层模块不应该依赖于下层模块,二者应该通过抽象来依赖
   ///               依赖抽象,而不是依赖细节
   ///   
   /// GOF23种设计模式是不包含简单工厂
   /// 简单工厂设计模式:包含一组需要创建的对象,通过一个工厂类来实例化对象,
   /// 好处就是去掉上端对细节的依赖,保证上端的稳定
   /// 缺陷:
   ///      没有消除矛盾,只是转移矛盾,甚至还集中了矛盾
   /// 任何设计模式都是解决一类问题的,不是万能的,
   /// 通常在解决一类问题的时候,还会带来新的问题
   /// </summary>
   class Program
   {
       static void Main(string[] args)
       {
           try
           {
               Player player = new Player()
               {
                   Id = 123,
                   Name = "Eleven"
               };
               {
                   Human race = new Human();//1 最原始最习惯的
               }
               {
                   IRace race = new Human();//2 左边换成抽象 依赖倒置原则
               }
               {
                   IRace race = ObjectFactory.CreateInstance(RaceType.Human);
                   //new IRace();//接口不能直接实例化  问题出来了,既不想依赖细节,又需要对象
                   player.Play(race);
               }
               {
                   //可配置
                   Console.WriteLine("*****************Factory+Config***************");
                   IRace race = ObjectFactory.CreateInstanceConfig();
                   player.Play(race);
               }
               {
                   //可配置可扩展
                   Console.WriteLine("*****************Factory+Config+Reflection***************");
                   IRace race = ObjectFactory.CreateInstanceConfigReflection();
                   player.Play(race);
               }


               //{
               //    Human human = new Human();
               //    player.PlayHuman(human);
               //    player.Play(human);
               //}
               //{
               //    Undead undead = new Undead();
               //    player.PlayUndead(undead);
               //    player.Play(undead);
               //}
               //{
               //    ORC oRC = new ORC();
               //    player.Play(oRC);
               //}
               //{
               //    NE nE = new NE();
               //    player.Play(nE);
               //}
               //类库
           }
           catch (Exception ex)
           {
               Console.WriteLine(ex.Message);
           }
           Console.Read();
       }
   }
}

ObjectFactory.cs

using FactoryPattern.War3.Interface;
using FactoryPattern.War3.Service;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace SimpleFactory
{
   /// <summary>
   /// 
   /// </summary>
   public class ObjectFactory
   {
       public static IRace CreateInstance(RaceType raceType)
       {


           IRace race = null;
           switch (raceType)
           {
               case RaceType.Human:
                   race = new Human();
                   break;
               case RaceType.NE:
                   race = new NE();
                   break;
               case RaceType.ORC:
                   race = new ORC();
                   break;
               case RaceType.Undead:
                   race = new Undead();
                   break;
               default:
                   throw new Exception("wrong raceType");
           }
           return race;
       }

       private static string IRaceType = ConfigurationManager.AppSettings["IRaceType"];
       public static IRace CreateInstanceConfig()
       {
           RaceType raceType = (RaceType)Enum.Parse(typeof(RaceType), IRaceType);
           return CreateInstance(raceType);
       }

       //真正的把细节依赖给去掉,意味着不能直接new,那怎么获取对象? 反射

       private static string IRaceTypeReflection = ConfigurationManager.AppSettings["IRaceTypeReflection"];
       public static IRace CreateInstanceConfigReflection()
       {
           Assembly assembly = Assembly.Load(IRaceTypeReflection.Split(',')[1]);
           Type type = assembly.GetType(IRaceTypeReflection.Split(',')[0]);
           return (IRace)Activator.CreateInstance(type);
       }

       //1  可配置后,如果一个接口,可能需要不同的实例?
       //2  今天只是创建Race,就需要一个方法;那项目中有N多个接口,难道每个接口都去创建一个工厂方法吗?
       //3  IOC&&DI。。。。

       /*
       今天课程都能听懂,100%      刷个1
                         80%       刷个2
                        低于80%    刷个3
         后面的三个问题我也了解的  刷个4
        */


   }
   public enum RaceType
   {
       Human,
       NE,
       ORC,
       Undead
   }
}

最后,想了解更多,可加入CCNetCore社区,橙子带你走上.netcore学习之路。
你可以免费获取到:

  • 设计模式
  • 面试八股文
  • 问题答疑
  • 闲聊茶馆
  • Asp.Netcore图文源码解读
  • 第一代软件架构单体应用相关技术
  • 第二代软件架构分布式应用相关技术
  • 第三代软件架构微服务应用相关技术
  • 第四代软件架构网格服务应用相关技术

站点网址:ccnetcore.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 设计模式是软件开发中常用的一解决方案,它们是一些经过实践验证的可复用设计思想。设计模式允许开发人员在类和对象的结构上灵活地更改,并提供了一优雅的解决方案来应对各软件开发问题。 GOF(Gang of Four)是指Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位软件工程师,他们在《设计模式:可复用面向对象软件的基础》一书中总结了23常见的设计模式,这本书因此而获得了“设计模式圣经”的称号。 这本书以案例为基础,深入浅出地讲解了每个设计模式的原理和应用场景,并提供了C++实现源码。 其中,创建型设计模式包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。这些模式都提供了一方式来创建对象,使得程序在实例化对象时更加灵活和可扩展。 结构型设计模式包括适配器模式、装饰器模式、代理模式、组合模式、享元模式和外观模式。这些模式关注如何通过类和对象的组合来创建更大的结构,并提供了一优雅的方式来简化系统的复杂性。 行为型设计模式包括策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式和中介者模式。这些模式关注对象之间的通信和交互,它们提供了一优雅的方式来实现松耦合和可维护的代码。 总之,设计模式是软件开发中非常重要的一部分,它们提供了一通用的解决方案来处理常见的设计问题。通过学习和应用设计模式开发人员可以提高代码的可复用性、可扩展性和可维护性,并加快开发进度。 ### 回答2: 设计模式是软件开发中常用的解决问题的一思维方式或者说是一已被证实有效的解决问题的方法。GOF 23设计模式是由四位著名的软件工程师提出并总结出的一套经典的设计模式GOF 23设计模式分别是创建型模式、结构型模式和行为型模式。创建型模式包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、建造者模式和原型模式。结构型模式包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式。行为型模式包括策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式和解释器模式。 GOF 23设计模式具有不同的应用场景和优势。通过学习和理解这些设计模式开发者可以更加灵活地应对各软件开发中的问题。同时,掌握这些设计模式也有助于提高代码的可读性、可维护性和可扩展性。 附带C语言实现源码是一更加具体的学习和理解设计模式的方法。通过查看实现源码,可以更加直观地看到设计模式在实践中的应用。这些源码可以作为学习的参考,帮助开发者更好地理解设计模式的思想和使用方式。 总之,设计模式是软件开发中非常重要的一部分,通过学习GOF 23设计模式并理解其应用场景和优势,可以提高软件开发的效率和质量。附带C语言实现源码能够更加具体地帮助开发者理解设计模式的实际应用。 ### 回答3: 设计模式是软件工程中常用的一设计思想或模板,可以用于解决特定的问题和提供可重用的解决方案。GOF(Gang of Four)提出了23设计模式,并在书籍《设计模式:可复用面向对象软件的基础》中进行了详细的解析和说明。 这本书详细地介绍了23设计模式,包括创建型模式、结构型模式和行为型模式。通过阅读这本书,读者可以了解每设计模式的特点、适用场景和实现方法。另外,书中还通过示例代码的方式演示了每设计模式的具体实现,并提供了附带的C语言实现源码。 这本书对于理解设计模式的概念和思想非常有帮助。它不仅提供了23设计模式的名字和简介,还详细解释了每模式的适用场景和应用案例。读者可以通过学习这些设计模式,了解如何将它们应用于自己的软件开发工作中,提高代码的可重用性和可维护性。 书中的C语言实现源码是帮助读者理解和实践设计模式的重要资源。通过阅读源码,读者可以更加深入地理解每设计模式的具体实现细节,并进一步提升自己的编程能力。 总之,通过学习《设计模式:可复用面向对象软件的基础》这本书,读者可以全面了解设计模式的概念、分类和实现方法,并通过阅读附带的C语言实现源码来加深对设计模式的理解和应用。这将对提升软件设计和开发的能力和水平非常有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值