C#实现工厂方法模式

 更新时间:2022年07月11日 14:48:44   作者:奋斗的大橙子  
这篇文章介绍了C#实现工厂模式的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

场景:简单工厂时候,我设计了一个场景,有三种剑去打怪,这时候,需求变化了,我三种剑变成了,匕首、剑以及木棒,想要用工厂方法来实现,怎么弄?

1.上文讲过简单工厂模式,它的最大优点在于工厂类内有创建类型的判断逻辑,客户端只需要通过动态的选择想要创建的类型,就可以交给工厂类来创建,去除了客户与具体产品之间的依赖。

缺点在于,当新建一个类型的时候,需要修正工厂类中的判断逻辑,添加一个case,此时就违背了开放-封闭原则。

2.工厂方法模式的引入:定义一个用于创建对象的接口,让子类觉得实例化哪一个类,工厂方法模式使得一个类的实例化延迟到了它的子类。

客户端再使用工厂方法模式的时候,需要决定实例化哪一种工厂,选择判断的问题依然存在,也就是说工厂方法模式是对简单工厂的改进,把判断逻辑移动到了客户端。当加入新功能时候,原来是要修正工厂类,现在修改客户端就行了。

领悟:例如在进行编写一个计算器的时候。

  • ①如果把所有的判断逻辑和类的创建放在一个类中,那么出现的问题是,新增加一个功能,其他的功能也会收到影响。所以引进了简单工厂模式,使得耦合性降低了。
  • ②简单工厂在添加新功能的时候,需要改工厂类,同样违背开放-封闭原则,对更改是关闭的,对扩展是开放的。
  • ③针对简单工厂又出现了工厂方法,这时候将工厂类进一步抽象为多个工厂类。这时候我添加一个新功能,就需要添加一个新的工厂类和一个具体的功能类。工作量也变大了。

Product:抽象产品

ConcreteProduct:具体产品

Factory:抽象工厂

ConcreteFactory:具体工厂

3.代码实现:

Weapon.cs

namespace FactoryMethod
{
    public class Weapon
    {
        //设计一个怪兽,血量是100(其实并不是很合适,怪兽应该单独设计
        //作为beat方法的参数传入
        protected int monsterLife = 100;
        public virtual void beat()
        {

        }
    }
}

Knife.cs

namespace FactoryMethod
{
    public class Knife : Weapon
    {
        public override void beat()
        {
            while (monsterLife > 0)
            {
                base.monsterLife -= 20;
                Console.WriteLine("The Monster is still alive!");
            }
            Console.WriteLine("Excellent!The Monster is dead!"); 
        }
    }
}

Sword.cs

namespace FactoryMethod
{
   public class Sword:Weapon
    {
       public override void beat()
       {
           while (monsterLife > 0)
           {
               base.monsterLife -= 50;
               Console.WriteLine("The Monster is still alive!");
           }
           Console.WriteLine("Excellent!The Monster is dead!");
       }
    }
}

Stick.cs

namespace FactoryMethod
{
    public class Stick:Weapon
    {
        public override void beat()
        {
            while (monsterLife > 0)
            {
                base.monsterLife -= 100;
                Console.WriteLine("The Monster is still alive!");
            }
            Console.WriteLine("Excellent!The Monster is dead!");
        }
    }
}

IWeaponFactory.cs

namespace FactoryMethod
{
    public interface IWeaponFactory
    {
        Weapon CreateWeapon();
    }
}

KnifeFactory.cs

namespace FactoryMethod
{
   public class KnifeFactory:IWeaponFactory
    {
       public Weapon CreateWeapon()
       {
           return new Knife();
       }
    }
}

SwordFactory.cs

namespace FactoryMethod
{
    public class SwordFactory : IWeaponFactory
    {
        public Weapon CreateWeapon()
        {
            return new Sword();
        }
    }
}

StickFactory.cs

namespace FactoryMethod
{
    public class StickFactory:IWeaponFactory
    {
        public Weapon CreateWeapon()
        {
            return new Stick();
        }
    }
}

Program.cs

namespace FactoryMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            IWeaponFactory factory = new SwordFactory();
            Weapon weapon = factory.CreateWeapon();
            weapon.beat();

            factory = new KnifeFactory();
            weapon = factory.CreateWeapon();
            weapon.beat();

            factory = new StickFactory();
            weapon = factory.CreateWeapon();
            weapon.beat();

            Console.ReadKey();

        }
    }
}

运行结果:

到此这篇关于C#实现工厂方法模式的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • c#方法重写和隐藏的学习示例

    c#方法重写和隐藏的学习示例

    最近正在学习c#,对其中的方法重写和隐藏的概念很是模糊,现在将其归纳如下供大家参考
    2014-01-01
  • C#动态执行批处理命令的方法

    C#动态执行批处理命令的方法

    这篇文章主要介绍了C#动态执行批处理命令的方法,可实现动态执行一系列控制台命令,并允许实时显示出来执行结果,需要的朋友可以参考下
    2014-11-11
  • C#微信接口之推送模板消息功能示例

    C#微信接口之推送模板消息功能示例

    这篇文章主要介绍了C#微信接口之推送模板消息功能,结合实例形式分析了C#操作微信推送模板消息接口的具体操作步骤与相关使用技巧,需要的朋友可以参考下
    2017-07-07
  • C#实现同Active MQ通讯的方法

    C#实现同Active MQ通讯的方法

    这篇文章主要介绍了C#实现同Active MQ通讯的方法,简单分析了Active MQ的功能及C#与之通讯的实现技巧,需要的朋友可以参考下
    2016-07-07
  • C#基于UDP进行异步通信的方法

    C#基于UDP进行异步通信的方法

    这篇文章主要介绍了C#基于UDP进行异步通信的方法,实例分析了C#基于UDP实现异步通信的相关技巧,需要的朋友可以参考下
    2015-04-04
  • C# WPF编程之元素绑定详解

    C# WPF编程之元素绑定详解

    数据绑定是一种关系,该关系告诉WPF从源对象提取一下信息,并用这些信息设置目标对象的属性,下面我们就来了解一下WPF编程中元素绑定的相关知识吧
    2024-04-04
  • C#实现自定义打印文字和图片的示例代码

    C#实现自定义打印文字和图片的示例代码

    本文主要介绍了C#实现自定义打印文字和图片的示例代码,C#中打印其实就是自己绘图+调用系统打印函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C#中RSA加密与解密的实例详解

    C#中RSA加密与解密的实例详解

    这篇文章主要介绍了C#中RSA加密与解密的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • C# 解析 Excel 并且生成 Csv 文件代码分析

    C# 解析 Excel 并且生成 Csv 文件代码分析

    这篇文章主要介绍了C# 解析 Excel 并且生成 Csv 文件的方法和代码分享,有需要的朋友可以参考下
    2014-10-10
  • C#实现的算24点游戏算法实例分析

    C#实现的算24点游戏算法实例分析

    这篇文章主要介绍了C#实现的算24点游戏算法,实例分析了算24点游戏相关的运算技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04

最新评论