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

(0)

相关推荐

  • 深入c#工厂模式的详解

    什么是工厂模式?类比生活中的概念,当我们需要打电话的时候,我们需要一部手机,我们通常会选择直接去卖手机的实体店买.但在程序设计中,当我们需要调用一个类(PhoneA或PhoneB)的方法的时候,我们往往还要关心他是怎么new出来的(见代码段1).这就好比我们自己还要去工厂里面告诉他们你要怎么生产出一部我需要的手机.而我们只关心他能不能打电话,你怎么做的关我屁事.所以这就有了工厂模式.工厂模式其实就是抽象出一个工厂,我需要什么手机,去哪个工厂买就行了.我不必关心他的制作过程,你只要能生产我要的功能

  • 浅谈C#设计模式之工厂模式

    工厂模式和简单工厂有什么区别.废话不多说,对比第一篇例子应该很清楚能看出来. 优点: 工厂模式弥补了简单工厂模式中违背开放-封闭原则,又保持了封装对象创建过程的优点. 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DesignModel {     public inte

  • 深入了解c# 设计模式之简单工厂模式

    简单工厂模式,需要说明的是,它并不属于GOF 23种设计模式中的一种.但它却丰富了工厂模式家族,因为其简单的思想和使用方式,也有很广泛的使用 简单工厂模式又称为静态工厂模式,它用来确定创建哪一种对象的实例.这种模式应该说是最简单最实用的工厂模式了,它将外界创建对象的逻辑收集起来,做到了对外界隔离对象的创建逻辑的目的,使外面完全的成为了对象实例的使用者,明确了职责. 不过这种模式也有着非常明显是的缺点,工厂类中集中了所有对象实例的创建逻辑,造成了功能的高内聚:另外在扩展方面,如果需要添加新的类,就

  • C# 设计模式系列教程-工厂方法模式

    1. 概述: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到子类. 2. 模式中的角色 2.1 抽象工厂(Creator):这个抽象类(或接口)声明一个创建对象的工厂方法,用来返回一个Product类型的对象. 2.2 具体工厂(ConcreteCreator):重定义工厂方法,返回一个具体的Concrete Product实例. 2.3 抽象产品(Product):定义工厂方法所创建的对象. 2.4 具体产品(ConcreteProduct): 具体产品,

  • C#设计模式之简单工厂模式

    设计模式分类: 创建型模式. 结构型模式. 行为模式. 23种设计模式,如何记.面向对象的系统中有很多对象,创建型模式解决的问题就是如何创建对象,何时创建对象,它努力的让代码不要太多的关注对象的具体类型,不用关注对象的创建细节,而知需要了解对象的抽象类型,创建对象的工作由创建对象的工厂来实现.面向对象的系统中,对象如何组织,采用什么样的结构组织比较合理,这个是由结构型模式来处理的.合理的使用结构型模式可以使系统具备更好的灵活性.扩展性和维护性.行为模式规定了各个对象间的应该具备的职责. 严格来说

  • C# 设计模式系列教程-简单工厂模式

    1. 概述: 将一个具体类的实例化交给一个静态工厂方法来执行,它不属于GOF的23种设计模式,但现实中却经常会用到 2. 模式中的角色 2.1 工厂类(Simple Factory): 只包含了创建具体类的静态方法. 2.2 抽象产品(Product):定义简单工厂中要返回的产品. 2.3 具体产品(ConcreteProduct):具体产品. 3. 模式解读 3.1 简单工厂模式的一般化类图 3.2 简单工厂模式的代码实现 /// <summary> /// 简单工厂类,用sealed修饰,

  • C#实现简单工厂模式

    情景:有一个怪兽,HP是100,现在勇士有可以使用武器将其打败,有三种武器,木剑每次打击20血,铁剑每次50血,金刚剑每次100血,如果想要使用简单工厂方式,怎么设计? 一.啥是简单工厂? 通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 结构大概如下图: 画出场景的类图 解释: 1.Sword是一个基类,通过其中有一个字段保存怪物的血量,还有一个虚方法是打击怪物的方法 2.有三个具体的武器的类,分别对应木剑.铁剑.金刚剑,实现了各种对怪物打击的逻辑 3.Create

  • 计算器实例代码讲解C#工厂模式

    工厂模式作为很常见的设计模式,在日常工作中出镜率非常高,程序员们一定要掌握它的用法哟,今天跟着老胡一起来看看吧. 举个例子 现在先让我们来看一个例子吧,比如,要开发一个简单的计算器,完成加减功能,通过命令行读入形如1+1的公式,输出2这个结果,让我们看看怎么实现吧. 第一个版本 这个版本里面,我们不考虑使用模式,就按照最简单的结构,怎么方便怎么来. 思路非常简单,仅需要实现以下几个方法 取运算数 取运算符 输出结果 class Program { static int GetOperatorIn

  • JavaScript设计模式之工厂方法模式介绍

    1. 简单工厂模式 说明:就是创建一个工厂类,里面实现了所对同一个接口的实现类的创建. 但是好像JavaScript 好像没有 接口 这号东西,所以我们去掉接口这个层; 当然,我们这里的 实现类 下的成员变量,方法应该都是一样的: 例如:这时举短信发送跟邮件发送的例子; 1>. 邮件发送[实现]类 复制代码 代码如下: function MailSender() {     this.to = '';     this.title = '';     this.content = ''; } M

  • Java设计模式编程中的工厂方法模式和抽象工厂模式

    工厂方法模式 动机 创建一个对象往往需要复杂的过程,所以不适合包含在一个复合工厂中,当有新的产品时,需要修改这个复合的工厂,不利于扩展. 而且,有些对象的创建可以需要用到复合工厂访问不到的信息,所以,定义一个工厂接口,通过实现这个接口来决定实例化那个产品,这就是工厂方法模式,让类的实例化推迟到子类中进行. 目的 1. 定义一个接口,让子类决定实例化哪个产品. 2. 通过通用接口创建对象. 实现 1. 产品接口和具体产品很好理解. 2. 工厂类提供一个工厂方法,返回一个产品对象.但是这个工厂方法是

  • Android源码学习之工厂方法模式应用及优势介绍

    工厂方法模式定义: Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses. 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 常用的工厂方法模式结构: 如上图所示(截取自<Head Firs

  • java设计模式之工厂方法模式

    概要 设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美. 定义 定义一个用于创建对象的接口,让其子类去决定实例化那个类 使用场景 任何使用复杂对象的地方,都可以使用工厂模式 UML 1.抽象工厂 抽象工厂:我们都知道,工厂,一般只有一个作用,那就生产,比如,吉利汽车厂,那就制造吉利汽车,iphone手机制造厂就造iphone等等 所以可以用一个简单的方法概括,就是create(); 2.具体汽车制造厂 具体汽车制造厂:实现了抽象工厂,具有实际的制造汽车的流程和方法等 3.

  • Java设计模式编程之工厂方法模式的使用

    定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 类型:创建类模式 类图: 工厂方法模式代码 interface IProduct { public void productMethod(); } class Product implements IProduct { public void productMethod() { System.out.println("产品"); } } interface IFactory { publ

  • asp.net 简单工厂模式和工厂方法模式之论述

    简单工厂模式和工厂方法模式的区别 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了于具体产品的依赖.而工厂方法模式定义了一个用于创建对象的借口,让子类决定实例化哪一个类,工厂方法是一个类的实例化延迟到其子类.其实多做一些联系不难发现:工厂方法模式实现时,客户端需要决定实例化那个工厂来实现运算类,选择判断的问题还是存在的,也即是说,工厂方法吧简单工厂的内部逻辑判断移到了客户端代码来进行,我想要加一些功能,本来是需要修改工厂类的,

  • .NET工厂方法模式讲解

    工厂方法模式介绍: 工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 工厂方法模式结构图: 角色分类: 抽象工厂角色:是工厂方法模式的核心,与应用程序无关.任何在模式中创建的对象的工厂类必须实现这个接口. 具体工厂角色:这是实现抽象工厂接口的具体

  • 详解设计模式中的工厂方法模式在Python程序中的运用

    工厂方法(Factory Method)模式又称为虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,属于类的创建型模式.在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实体化哪一个类. 在简单工厂模式中,一个工厂类处于对产品类进行实例化的中心位置上,它知道每一个产品类的细节,并决定何时哪一个产品类应当被实例化.简单工厂模式的优点是能

  • 举例解析设计模式中的工厂方法模式在C++编程中的运用

    工厂方法模式不同于简单工厂模式的地方在于工厂方法模式把对象的创建过程放到里子类里.这样工厂父对象和产品父对象一样,可以是抽象类或者接口,只定义相应的规范或操作,不涉及具体的创建或实现细节. 其类图如下: 实例代码为: #pragma once class IProduct { public: IProduct(void); virtual ~IProduct(void); }; #pragma once #include "iproduct.h" class IPad : public

  • iOS应用设计模式开发中对简单工厂和工厂方法模式的运用

    简单工厂模式 正如此模式的名称一样,简单工厂模式基本上是所有设计模式里最简单的一种,类与类之间的关系一目了然.这次我就用很多地方经常举的例子--计算器,来说明这个模式.首先给大家展示一下类之间的结构图: 通过这张结构图,可以清晰的看到,加法类.减法类.乘法类.除法类继承自运算类,简单工厂类依赖于运算类的实例化来实现相应的运算功能,好的,看起来并不复杂,让我们直接展示一下代码吧(鉴于目前点点不支持Objective C的代码高亮,所以就直接写啦,尽量保持整齐吧.另,为了照顾像我一样基础不是很好的同

随机推荐