你发现什么问题了吗?没错,这违背了面向对象五大原则之一——依赖倒置(抽象不应该依赖具体);而且,这也不满足“对象创建后不得进行更改”的需求。所以,我们需要提取出一个抽象层IPersion。
public interface IPerson { string Name { get; } int Gender { get; } int Age { get; } } class Person : IPerson { public string Name { get; set; } public int Gender { get; set; } public int Age { get; set; } } public interface IPersonBuilder { IPerson Build(); IPersonBuilder SetName(string name); IPersonBuilder SetGender(int gender); IPersonBuilder SetAge(int age); }3.下一步就是构建PersonBuilder了,用来实现IPersonBuilder接口的具体逻辑。
class PersonBuilder : IPersonBuilder { private readonly Person _person = new Person(); public IPerson Build() { return _person; } public IPersonBuilder SetName(string name) { _person.Name = name; return this; } public IPersonBuilder SetGender(int gender) { _person.Gender = gender; return this; } public IPersonBuilder SetAge(int age) { _person.Age = age; return this; } } //提供一个辅助类,用来帮 Client 创建 PersonBuilder public class PersonBuilderHelper { public static IPersonBuilder CreatePersonBuilder() { return new PersonBuilder(); } }4.Ok,大功告成!来测试一下吧
var person = PersonBuilderHelper.CreatePersonBuilder() .SetAge(20) .SetName("jjj") .Build(); //输出:jjj,0,20 Console.WriteLine($"{person.Name},{person.Gender},{person.Age}"); 四、总结经典版与变种版本的区别:
经典版倾向于将构建规划封装起来,Client不关心内部逻辑;而变种版本消除了Director,使得Client拥有更多的主动权,可以自由地进行构建。
经典版需要使用Director进行构建,然后使用Builder进行组装返回结果;变种版本则直接使用Builder进行链式构建并组装返回结果,结构更加清晰明了。
经典版常用于多种产品的构建是比较固定的情况,Director种类也不宜过多,且必须适应所有产品;而变种版更倾向于某一种产品的构建,构建方式不固定、相当复杂的情况。
如果有新发现会进行补充!