.Net 设计模式进阶之路——工厂方法模式[Factory Method]| 8月更文挑战

192 阅读3分钟

「本文是月更第2天文章。对我来说,这是一个挑战,虽然很早就读过设计模式,但已经还回给了书本,这次拿来无非是想挑战下自己的输出能力,加油,webmote」

  • 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
  • 📢本文作者:由webmote 原创,首发于 【掘金】
  • 📢作者格言: 生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起加油!💪💪💪

🎏 序言

模式: 模式这个词,可以理解为套路,很像程咬金的三板斧,按照这个套路就可以搞定某件事。 设计模式: 就是软件/架构设计时的套路, 最是套路得人心。

... 以下省略若干字,可以参考第一天文章所述。

🎏 01.工厂方法模式的解释

意图: 定义一个抽象方法或接口,延迟对象的产生到子类,让子类决定产生什么样的产品对象。

问题领域: 它一般用来解决下列问题。

  • 当不知道创建的对象细节时,仍然想使用它
  • 一个类细节由它的子类指定
  • 被创建对象可以被扩展实现,但又有一部分细节是可以预知的。

解决方案: 我们使用UML图来描述它。

image.png

图中可以看出,Creator定义抽象接口,由ConcreateCreator 实现工厂方法,产生最终的对象 ConcreateDestObject。

Creator的实现可以有很多个,而产生的对象实现也可以有不同的DestObject子类。

效果:

  • 好处:
  1. 在特定场景下可以解耦ConcreateDestObject类实现;
  2. 更加符合开闭原则;
  3. 一个工厂不需要知道另一个;
  4. 客户端确切地知道将创建哪个对象;
  • 限定:
  1. 如果子类的构建比较简单,那么增加子类增加了工作量,可以缩减为带参数的工厂方法,根据不同参数,返回不同的预制件;

🎏 02. dotnet core 源码赏析

在算法实现时,HashAlgorithm构建时采用了工厂方法模式。

下面是我们使用这些子类来构建HashAlgorithm

HashAlgorithm hashAlgorithm = null;
    switch (type)
    {
        case HashType.MD5:
            hashAlgorithm = MD5.Create();
            break;
        case HashType.SHA1:
            hashAlgorithm = SHA1.Create();
            break;      
    }
}

其工厂方法接口定义为Create,其中Create接口返回具体的类,该类均继承自HashAlgorithm,最后生成出预制件。

🎏 03. dotnet 生成器实现

这是一个例子,实现一个车辆工厂方法,接口定义如下:

有一个车辆类型由用户决定,我们分别有三个不同的工厂,其生产不同的车辆,当然生产的工艺可能不同,不过既然有工厂参与,那么细节我们就不操心了,只需要告诉工厂生产不同的车辆即可。

image.png

 public abstract class Vehicle  
{  
    internal int capacity;  
    public abstract string GetData();  
  
    public int GetCapacity()  
    {  
        return capacity;  
    }  
    public void AddPassengers(int passengers)  
    {  
        if (capacity < passengers)  
        {  
            throw new Exception(this.GetData() + " reached max capacity");  
        }  
        else  
            capacity -= passengers;  
    }  
}  

public abstract class VehicleCreator  
{  
    protected abstract Vehicle MakeVehicle();  
  
    public Vehicle CreateVehicle()  
    {  
        return this.MakeVehicle();  
    }  
}  
public class BoatCreator : VehicleCreator  
{  
    protected override Vehicle MakeVehicle()  
    {  
        Vehicle vehicle = new Boat();  
        vehicle.capacity = 150;  
        return vehicle;  
    }  
}  

实现比较简单,在这里不列出了,等后续一块放在github上。

调用方,可以按照类型调用直接使用。

switch (vehicleType)  
{  
    case VehicleType.Boat:  
        vehicle = new BoatCreator().CreateVehicle();  
        break;  
   ...
    default:  
        vehicle = null;  
        break;  
}

🎏 04. 小结

是的,感觉又水了一篇文章,今天下班晚了,写的也晚了,感觉没有2-3个小时,是搞不定一篇文章的,礼品真的很重要吗?

重要,没有礼品就没有都动力!哈哈,加油!

养成一个好习惯,需要不停的激励和鼓励,写作的能力也许就是不断的写中提升的,当然还有自身的额能力,在不断的输出过程中,发现自己的不足以及巩固自己的知识。

30天不停更,目标很远大,今天是第二天,加油吧,兄弟们!

例行小结,理性看待!

结的是啥啊,结的是我想你点赞而不可得的寂寞。😳😳😳

👓都看到这了,还在乎点个赞吗?

👓都点赞了,还在乎一个收藏吗?

👓都收藏了,还在乎一个评论吗?