(超详细,超易懂)设计模式(二):工厂方法模式,取经团队需要猴子的实践

         如果你也喜欢C#开发或者.NET开发,可以关注我,我会一直更新相关内容,并且会是超级详细的教程,只要你有耐心,基本上不会有什么问题,如果有不懂的,也可以私信我加我联系方式,我将毫无保留的将我的经验和技术分享给你,不为其他,只为有更多的人进度代码的世界,而进入代码的世界,最快捷和最容易的就是C#.NET,准备好了,就随我加入代码的世界吧!

        工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化的类是哪一个。工厂方法模式将对象的实例化延迟到子类中进行。

工厂方法模式的实现步骤如下,我们以取经团队需要一只猴子的加入为例:

        1、先定义一个抽象产品接口(Product),该接口定义产品对象的共同方法(即我们定义一个抽象产品猴子的接口,接口中包含一个输出猴子的方法)。

 /// <summary>
 /// 抽象产品角色猴子
 /// </summary>
 public interface Monkey
 {
     /// <summary>
     /// 输出猴子
     /// </summary>
     void ExportMonkey();
 }

        2、创建具体产品类(ConcreteProduct),实现抽象产品接口(我们定义具体产品各类猴子类,实现抽象产品猴子的接口中输出猴子的方法)。

                1.1 灵明石猴

 /// <summary>
 /// 具体产品灵明石猴
 /// </summary>
 public class LingmingStoneMonkey : Monkey
 {
     /// <summary>
     /// 实现抽象产品输出猴子的方法
     /// </summary>
     public void ExportMonkey()
     {
         Console.WriteLine("你好!我是灵明石猴");
     }
 }

                1.2 六耳猕猴

 /// <summary>
 /// 具体产品六耳猕猴
 /// </summary>
 public class SixEaredMacaque : Monkey
 {
     /// <summary>
     /// 实现抽象产品输出猴子的方法
     /// </summary>
     public void ExportMonkey()
     {
         Console.WriteLine("你好!我是六耳猕猴");
     }
 }

                1.3 通背猿猴

 /// <summary>
 /// 具体产品通背猿猴
 /// </summary>
 public class TongbeiMonkey : Monkey
 {
     /// <summary>
     /// 实现抽象产品输出猴子的方法
     /// </summary> 
     public void ExportMonkey()
     {
         Console.WriteLine("你好!我是通背猿猴");
     }
 }

        3、创建抽象工厂类(Factory),定义创建产品对象的方法(即我们定义一个猴子工厂类,内含生产猴子的方法)。

 /// <summary>
 /// 抽象工厂猴子工厂
 /// </summary>
 public interface MonkeyFactory
 {
     /// <summary>
     /// 抽象工厂方法创建猴子
     /// </summary>
     /// <returns></returns>
     Monkey CreateMonkey();
 }

        4、创建具体工厂类(ConcreteFactory),继承抽象工厂类,并实现创建产品对象的方法(即不同的猴子是不同的工厂生产的,所有我们创建对应的工厂)。

                4.1 灵明石猴

 /// <summary>
 /// 具体工厂生产灵明石猴
 /// </summary>
 public class LingmingStoneMonkeyFactory : MonkeyFactory
 {
     /// <summary>
     /// 生产灵明石猴
     /// </summary>
     /// <returns></returns>
     public Monkey CreateMonkey()
     {
         Monkey monkey = new LingmingStoneMonkey();
         return monkey;
     }
 }

                4.2 六耳猕猴

/// <summary>
/// 具体工厂生产六耳猕猴
/// </summary>
public class SixEaredMacaqueFactory : MonkeyFactory
{
    /// <summary>
    /// 生产六耳猕猴
    /// </summary>
    /// <returns></returns>
    public Monkey CreateMonkey()
    {
        Monkey monkey =new SixEaredMacaque();
        return monkey;
    }
}

                4.3 通背猿猴

 /// <summary>
 /// 具体工厂生产通背猿猴
 /// </summary>
 public class TongbeiMonkeyFactory : MonkeyFactory
 { 
     /// <summary>
     /// 生产通背猿猴
     /// </summary>
     /// <returns></returns>
     public Monkey CreateMonkey()
     {
         Monkey monkey = new TongbeiMonkey();
         return monkey;
     } 
 }

        5、客户端通过具体工厂类来创建具体产品对象(现在取经团队需要一只猴子的加入,而且猴子得是六耳猕猴)。

 static void Main(string[] args)
 {
     //现在取经团队需要一只猴子的加入
     MonkeyFactory monkeyFactory;//抽象工厂猴子厂
     Monkey monkey;//抽象产品猴子
     //取经团队想要一只六耳猕猴
     monkeyFactory = new SixEaredMacaqueFactory();
     //让花果山的六耳猕猴工厂生产一只
     monkey = monkeyFactory.CreateMonkey();
     //将六耳猕猴给取经团队
     monkey.ExportMonkey();
     Console.ReadLine();
 }

        运行结果为(最后给我们取经团队的会是什么呢?):

        现在取经团队不想要六耳猕猴,想要灵明石猴了怎么办呢?

//现在取经团队需要一只猴子的加入
MonkeyFactory monkeyFactory;//抽象工厂猴子厂
Monkey monkey;//抽象产品猴子
//取经团队想要一只六耳猕猴
monkeyFactory = new LingmingStoneMonkeyFactory();
//让花果山的六耳猕猴工厂生产一只
monkey = monkeyFactory.CreateMonkey();
//将六耳猕猴给取经团队
monkey.ExportMonkey();
Console.ReadLine();

        输出结果

6、做最后的总结:

        通过工厂方法模式,客户端只需要知道抽象工厂类和抽象产品接口,无需关心具体的产品对象是如何创建的。工厂方法模式符合开闭原则,可以通过增加具体工厂类和具体产品类来扩展系统的功能。

优点:

        1、工厂方法模式符合开闭原则,增加新的产品时,只需要增加相应的具体工厂类,而不需要修改已有的代码。

        2、工厂方法模式将产品的创建工作延迟到具体工厂类中,使得核心工厂类与具体产品类解耦,增强了系统的可扩展性。

        3、工厂方法模式将责任分配到多个工厂类中,每个工厂类只负责创建特定的产品,使得代码更加清晰、可读性更强。

        4、工厂方法模式可以通过继承方式扩展,支持多态性,在系统中可以灵活地引入新的产品。

缺点:

        1、工厂方法模式增加了系统的类的数量,增加了代码的复杂度。

        2、工厂方法模式需要定义多个具体工厂类,增加了系统的抽象性和理解难度。

        3、工厂方法模式的客户端需要知道每个具体工厂类的存在,增加了系统的耦合度。

        4、工厂方法模式在需要创建的产品较多时,会导致工厂类的数量增加,代码量增加。

注意:在实际使用中,一般不会在客户端代码中使用new关键字来创建工厂对象,因为如果是使用new关键字来创建工厂对象,对于客户端而言,就不符合开闭原则了,那如何创建呢?就是将具体工厂类的类目存储在配置文件中,再通过程序集的反射机制,读取配置文件中存储的类名字符串生成对象,我这里是为了方便大家理解和熟悉工厂方法模式,所以才使用new关键字。

详细代码已上传:

https://download.csdn.net/download/Malex2024/89469831

  • 33
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值