C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C#工厂模式

C#实现工厂方法模式

作者:奋斗的大橙子

这篇文章介绍了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#实现工厂方法模式的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文