软件编程
位置:首页>> 软件编程>> C#编程>> C#实现工厂方法模式

C#实现工厂方法模式

作者:奋斗的大橙子  发布时间:2023-12-10 05:17:37 

标签:C#,工厂,模式

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

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

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

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

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

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

  • ①如果把所有的判断逻辑和类的创建放在一个类中,那么出现的问题是,新增加一个功能,其他的功能也会收到影响。所以引进了简单工厂模式,使得耦合性降低了。

  • ②简单工厂在添加新功能的时候,需要改工厂类,同样违背开放-封闭原则,对更改是关闭的,对扩展是开放的。

  • ③针对简单工厂又出现了工厂方法,这时候将工厂类进一步抽象为多个工厂类。这时候我添加一个新功能,就需要添加一个新的工厂类和一个具体的功能类。工作量也变大了。

C#实现工厂方法模式

Product:抽象产品

ConcreteProduct:具体产品

Factory:抽象工厂

ConcreteFactory:具体工厂

3.代码实现:

C#实现工厂方法模式

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#实现工厂方法模式

来源:https://www.cnblogs.com/dcz2015/p/5287347.html

0
投稿

猜你喜欢

  • 1、什么是 IOC?IOC-Inversion of Control,即控制反转。它不是什么技术,而是一种设计思想。传统的创建对象的方法是直
  • 笔者在使用Entity Framework中的Scaffolding机制自动创建拓展名为mdf的数据库及表单时,遇到如下的错误:A file
  • Properties属性文件中的值有等号和换行Spring配置Shiro的过滤器时,有个filterChainDefinitions属性,值
  • 前言MongoDB是一款由C++编写的高性能、开源、无模式的常用非关系型数据库产品,是非关系数据库当 * 能最丰富、最像关系数据库的数据库。它
  • 本文实例为大家分享了java图形用户界面实现菜单功能的具体代码,供大家参考,具体内容如下题目:编写一个图形用户界面,实现菜单的功能。有3个一
  • 本文实例讲述了C#实现为类和函数代码自动添加版权注释信息的方法,分享给大家供大家参考之用。具体方法如下:以web项目为例:一:给类加注释1.
  • 本文实例讲述了C#简单读写txt文件的方法。分享给大家供大家参考,具体如下://write txtStringBuilder builder
  • Dataway介绍Dataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足
  • 转发和重定向相同点都是web开发中资源跳转的方式。不同点转发:是服务器内部的跳转,浏览器的地址栏不会发生变化。从一个页面到另一个页面的跳转还
  • java实现数字转大写的方法说明:将数字金额转大写,如下:public class Test {  /**   *
  • 本文实例讲述了Android列表控件Spinner简单用法。分享给大家供大家参考,具体如下:Android的Spinner控件用来显示列表项
  • 最近做项目,ORM 使用的是 MyBatis,为了偷懒,我自然而然的想到了使用 MyBatis Generator(MBG)来生成数据库表对
  • 前言这几天看《Java并发编程之美》的时候又遇到了ThradLocal这个类,不得不说,这个类在平时很多场景都遇得到,所以对其进行一个系统性
  • 本文实例为大家分享了Android刷新加载框架的具体代码,供大家参考,具体内容如下1.定义一个接口控制下拉和上拉public interfa
  • * 缓存内存缓存本地缓存(SD卡缓存)网络缓存缓存顺序:首先从网络获取图片资源,然后将当前的图片缓存到本地,然后再缓存到内存中,那么下次访问
  • 最近因项目需要,需要跨域请求访问数据。跨域访问是指什么?[跨域]:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器
  • 简单工厂模式概述1.定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类2.在简单工厂模式中用于被创
  • 1,获取当前线程信息Thread.CurrentThread 是一个 静态的 Thread 类,Thread 的CurrentTh
  • 标识接口是没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。标接口在Java语言中
  • 获取Spring中的bean有很多种方式,再次总结一下:第一种:在初始化时保存ApplicationContext对象Application
手机版 软件编程 asp之家 www.aspxhome.com