「本文是月更第2天文章。对我来说,这是一个挑战,虽然很早就读过设计模式,但已经还回给了书本,这次拿来无非是想挑战下自己的输出能力,加油,webmote」
- 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
- 📢本文作者:由webmote 原创,首发于 【掘金】
- 📢作者格言: 生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起加油!💪💪💪
🎏 序言
模式: 模式这个词,可以理解为套路,很像程咬金的三板斧,按照这个套路就可以搞定某件事。 设计模式: 就是软件/架构设计时的套路, 最是套路得人心。
... 以下省略若干字,可以参考第一天文章所述。
🎏 01.工厂方法模式的解释
意图: 定义一个抽象方法或接口,延迟对象的产生到子类,让子类决定产生什么样的产品对象。
问题领域: 它一般用来解决下列问题。
- 当不知道创建的对象细节时,仍然想使用它
- 一个类细节由它的子类指定
- 被创建对象可以被扩展实现,但又有一部分细节是可以预知的。
解决方案: 我们使用UML图来描述它。
图中可以看出,Creator定义抽象接口,由ConcreateCreator 实现工厂方法,产生最终的对象 ConcreateDestObject。
Creator的实现可以有很多个,而产生的对象实现也可以有不同的DestObject子类。
效果:
- 好处:
- 在特定场景下可以解耦ConcreateDestObject类实现;
- 更加符合开闭原则;
- 一个工厂不需要知道另一个;
- 客户端确切地知道将创建哪个对象;
- 限定:
- 如果子类的构建比较简单,那么增加子类增加了工作量,可以缩减为带参数的工厂方法,根据不同参数,返回不同的预制件;
🎏 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 生成器实现
这是一个例子,实现一个车辆工厂方法,接口定义如下:
有一个车辆类型由用户决定,我们分别有三个不同的工厂,其生产不同的车辆,当然生产的工艺可能不同,不过既然有工厂参与,那么细节我们就不操心了,只需要告诉工厂生产不同的车辆即可。
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天不停更,目标很远大,今天是第二天,加油吧,兄弟们!
例行小结,理性看待!
结的是啥啊,结的是我想你点赞而不可得的寂寞。😳😳😳
👓都看到这了,还在乎点个赞吗?
👓都点赞了,还在乎一个收藏吗?
👓都收藏了,还在乎一个评论吗?