C#设计模式之工厂模式

作者:.NET开发菜鸟 时间:2023-07-10 13:43:33 

这是我们用得比较多的一种设计模式,也是23种标准设计模式之一,使用前面讲的简单工厂设计模式,遇到具体产品经常变换时就不太适合了,违反了开闭设计原则;怎么才能避免修改工厂类呢?工厂方法模式可以做到。
工厂方法模式要求我们应该有一个抽象的工厂类,我们知道尽量使用抽象类或接口来定义就可以达到一个开闭原则的效果,这样我们在抽象的工厂类定义一个生产产品的方法,这个方法就是工厂方法,这也是工厂方法模式的由来,他具体的行为会有他的子类或实现类来实现。如果想生产某种产品,就定义一个新的产品,新的产品工厂类,这样就实现了不同的产品进行一个不同的创建,这样如果有信的产品,只需要添加新的工厂类,原来写好的代码不会发生变化,这种方式符合开闭原则,可扩展比较好。

C#设计模式之工厂模式

添加一个具体产品,只需要在添加一个具体产品的工厂类实现抽象工厂类,不需要修改原来的代码

C#设计模式之工厂模式

示例代码:

抽象产品类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   /*
      动物抽象类
    * 抽象产品
    */
   public abstract class Animal
   {
       public abstract void Eat();
   }
}

抽象工厂类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   /*
     动物抽象工厂类

*/
   public abstract class AnimalFactory
   {
       public abstract Animal GetAnimal();

}
}

生产狗的具体工厂类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   /// <summary>
   /// 具体工厂:生成狗
   /// </summary>
  public class DogFactory :AnimalFactory
   {

public override Animal GetAnimal()
       {
           return new Dog();
       }
   }
}

生产企鹅的具体工厂类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   /// <summary>
   /// 具体工厂:生成企鹅
   /// </summary>
   public class PenguinFactory :AnimalFactory
   {
       public override Animal GetAnimal()
       {
           return new Penguin();
       }
   }
}

具体产品狗类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   /*
      具体的产品类,实现抽象产品类
    */
   public class Dog:Animal
   {
       // 实现抽象方法
       public override void Eat()
       {
           Console.WriteLine("狗在吃饭!");
       }
   }
}

具体产品企鹅类:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   /*
     具体产品类,实现抽象产品类

*/
   public class Penguin : Animal
   {
       // 实现抽象方法
       public override void Eat()
       {
           Console.WriteLine("企鹅在吃饭!");
       }
   }
}

客户端调用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   class Program
   {
       static void Main(string[] args)
       {
           AnimalEat(new  DogFactory());
           Console.ReadKey();
       }

static void AnimalEat(AnimalFactory af)
       {
           Animal am = af.GetAnimal();
           am.Eat();
       }
   }
}

类图:

C#设计模式之工厂模式

如果想在增加一个Cat类,只需要增加一个具体的Cat类实现Animal类的方法,增加一个具体的Cat工厂类实现抽象工厂类即可,不需要在修改已经写好的代码,符合开闭原则。

使用接口的方式实现工厂模式

需求:使用面向对象的方式设计一个系统,描述使用卡车从事货运,使用公共汽车从事客运。使用工厂模式实现。

1、汽车接口:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   /// <summary>
   /// 汽车接口
   /// </summary>
   public interface ICar
   {
       /// <summary>
       /// 描述汽车从事的活动
       /// </summary>
       void Work();
   }
}

2、分别定义卡车(Truck)和公共汽车(Bus)类实现汽车接口(ICar)里面的Work()方法

Truck类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   /// <summary>
   /// 卡车类
   /// </summary>
   public class Truck : ICar
   {
       /// <summary>
       /// 卡车从事的活动
       /// </summary>
       public void Work()
       {
           Console.WriteLine("卡车从事货运");
       }
   }
}

Bus类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   /// <summary>
   /// 公共汽车类
   /// </summary>
   public class Bus:ICar
   {
       /// <summary>
       /// 公共汽车从事的活动
       /// </summary>
       public void Work()
       {
           Console.WriteLine("公共汽车从事客运");
       }
   }
}

3、定义汽车的工厂接口(ICarFactory):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   /// <summary>
   /// 汽车工厂接口
   /// </summary>
   public interface ICarFactory
   {
        ICar GetCar();
   }
}

4、分别定义卡车工厂(TruckFactory)和公共汽车工厂(BusFactory)实现ICarFactory接口

TruckFactory工厂:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   /// <summary>
   /// 卡车工厂接口
   /// </summary>
   public class TruckFactory:ICarFactory
   {
       /// <summary>
       /// 返回卡车类
       /// </summary>
       /// <returns></returns>
       public ICar GetCar()
       {
           return new  Truck();
       }
   }
}

BusFactory工厂:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   /// <summary>
   /// 公共汽车工厂
   /// </summary>
   public class BusFactory:ICarFactory
   {
       /// <summary>
       /// 返回公共汽车类
       /// </summary>
       /// <returns></returns>
       public ICar GetCar()
       {
           return new  Bus();
       }
   }
}

5、主程序调用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
   class Program
   {
       static void Main(string[] args)
       {

CarWork(new TruckFactory());
           Console.ReadKey();
       }

/// <summary>
       /// 根据汽车工厂返回具体的汽车类
       /// </summary>
       /// <param name="cf"></param>
       static void CarWork(ICarFactory cf)
       {
           ICar c = cf.GetCar();
           c.Work();
       }
   }
}

6、程序运行结果

C#设计模式之工厂模式

代码下载地址:点击下载

来源:https://www.cnblogs.com/dotnet261010/p/7352541.html

标签:C#,工厂,模式
0
投稿

猜你喜欢

  • Android Fragment实现顶部、底部导航栏

    2023-03-26 06:27:58
  • Android Studio如何为Activity添加自定义注解信息

    2023-01-06 18:28:04
  • java使用字符画一个海绵宝宝

    2023-09-08 09:45:19
  • IDEA 2020.1 版自动导入MAVEN依赖的方法(新版MAVEN无法自动导入/更新POM依赖、MAVEN设置自动更新、自动更新快捷键)

    2022-08-27 09:31:22
  • Android自定义View实现打字机效果

    2022-01-13 11:03:41
  • Unity实现简单的虚拟摇杆

    2023-01-26 11:38:14
  • 深入学习C#网络编程之HTTP应用编程(下)

    2023-03-16 12:06:37
  • android 仿微信demo——登录功能实现(服务端)

    2023-10-04 13:40:55
  • JavaFX实现UI美观效果代码实例

    2021-08-27 21:02:15
  • Java并发包之CopyOnWriteArrayList类的深入讲解

    2022-10-06 09:15:21
  • Android自定义View实现分段选择按钮的实现代码

    2022-09-06 07:46:21
  • mybatis多个区间处理方式(双foreach循环)

    2023-11-26 09:01:42
  • Android SDK Manager解决更新时的问题 :Failed to fetch URL...

    2023-03-17 23:23:36
  • springboot 整合fluent mybatis的过程,看这篇够了

    2022-09-14 01:16:53
  • Android Intent的几种用法详细解析

    2023-08-23 20:01:01
  • mybatis group by substr函数传参报错的解决

    2022-09-10 03:44:34
  • SpringMVC利用dropzone组件实现图片上传

    2022-01-19 00:37:00
  • Java异常的处理机制

    2023-12-03 15:33:19
  • C#泛型的使用及示例详解

    2022-03-14 07:01:59
  • java Semaphore共享锁实现原理解析

    2021-11-02 23:12:38
  • asp之家 软件编程 m.aspxhome.com