「本文是月更第1天文章。对我来说,这是一个挑战,虽然很早就读过设计模式,但已经还回给了书本,这次拿来无非是想挑战下自己的输出能力,加油,webmote」
- 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
- 📢本文作者:由webmote 原创,首发于 【掘金】
- 📢作者格言: 生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起加油!💪💪💪
🎏 序言
模式: 模式这个词,可以理解为套路,很像程咬金的三板斧,按照这个套路就可以搞定某件事。 设计模式: 就是软件/架构设计时的套路, 最是套路得人心。
有了套路,新来的人知道该怎么打,团队战友也能快速理解对方想用的是啥套路?
这样看来,中华民族的老祖先是很厉害的,很早就提出了战争界的套路《孙子兵法》,说起来美人计这个战争模式,估计各位心里都知道怎么回事吧? 嗯嗯,像貂蝉这样的美人,给我来一打...
当然要想成功的实施美人计,是不是要想好自己要解决的问题?面对的对象?最后的效果?
是的,模式的应用离不开问题领域、解决方案、效果评测。
🎏 01.生成器模式的解释
意图: 将一个复杂对象的生成,分解为不同部分的构建,通过组合这些构建用以生成不同表现的对象实例。
问题领域: 它一般用来解决下列问题。
- 当创建复杂对象的算法需要独立时
- 构造过程允许有不同的行为时
解决方案: 我们使用UML图来描述它。
图中可以看出,参与者有Director、DestObject类,这些类并无特别约束。
而最关键的Builder可以是接口或抽象基类,根据你的需要进行定制即可。
当然如果采用了生成器设计模式,那我们一般按照 XXXBuilder来定义接口或实现类,这样其他童鞋看到这些类时,可以很快的Get到XXX点。
效果:
- 好处:
- 客户端不必知道目标对象内部组成的细节,目标对象本身与目标对象的创建过程解耦,使得相同的创建过程可以创建不同的目标对象;
- 具体创建者可被扩展;
- 更加精细化的操控目标对象的生成过程,根据生成器提供的步骤逐步构建,可以精细化的控制到产品的内部。
- 限定:
- 目标对象有很多共同特定,不同的目标对象组成类似,差异不是很多;
🎏 02. dotnet core 源码赏析
在 WebHost构建时采用了生成器模式。
CreateHostBuilder(args).Build().Run();
其生成器接口定义如下,其中Configure系列的配置方法均返回构建器接口类,以便在构建时,可以方便的对配置进行连续配置,这也是链式调用的经典场景之一,例如构建时可以使用CreateHostBuilder(args).ConfigureAppConfiguration(a=>a.builder()).ConfigureServices((builder,s)=>s.register()).Build();,这样感觉像一个流水线机器一样,逐步构建完毕各个部分,最后生成出预制件。
public interface IHostBuilder
{
IDictionary<object, object> Properties
{
get;
}
IHost Build();
IHostBuilder ConfigureAppConfiguration(Action<HostBuilderContext, IConfigurationBuilder> configureDelegate);
IHostBuilder ConfigureContainer<TContainerBuilder>(Action<HostBuilderContext, TContainerBuilder> configureDelegate);
IHostBuilder ConfigureHostConfiguration(Action<IConfigurationBuilder> configureDelegate);
IHostBuilder ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate);
}
🎏 03. dotnet 生成器实现
这是一个例子,实现一个WebRequest的Builder,接口定义如下:
IHttpRequestBuilder BuildUrl(string url);
IHttpRequestBuilder BuildRequestMethod(string method);
WebRequest Build();
实现比较简单,在这里不列出了,等后续一块放在github上。
调用方,可以按照链式调用直接使用。
var builder = new HttpRequestBuilder();
var request = builder.BuildUrl("http://webmote.csdn.net")
.BuildRequestMethod("GET")
.Build();
Console.WriteLine($"request url: {request.RequestUri}");
🎏 04. 小结
是的,感觉又水了一篇文章,礼品真的很重要吗?
重要,没有礼品就没有都动力!
养成一个好习惯,需要不停的激励和鼓励,写作的能力也许就是不断的写中提升的,当然还有自身的额能力,在不断的输出过程中,发现自己的不足以及巩固自己的知识。
30天不停更,目标很远大,今天时第一天,加油吧,兄弟们!
例行小结,理性看待!
结的是啥啊,结的是我想你点赞而不可得的寂寞。😳😳😳
👓都看到这了,还在乎点个赞吗?
👓都点赞了,还在乎一个收藏吗?
👓都收藏了,还在乎一个评论吗?