java设计模式 - 创建者(干货)
深度讲解23种设计模式,力争每种设计模式都刨析到底。废话不多说,开始第二种设计模式 - 创建者。
顾名思义,创建者模式是用来创建对象的。根据笔者的经验,这种创建模式适用于复杂对象的创建。
我们先来看一下类图关系:
当创建Person对象时(假设Person对象中有非常多的属性),而我们挨个属性设置的时候,就会非常麻烦,还有可能会出现不同属性是在不同阶段中来设置,
也就是分步来设置的时候,不但属性容易丢失,而且代码阅读会比较头疼,那么这个时候,创建者模式将会是你非常棒的选择。
Person类如下
public class Person { private String name; private String interest; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getInterest() { return interest; } public void setInterest(String interest) { this.interest = interest; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", interest='" + interest + '\'' + '}'; } }
首先,我们可以抽象出一个接口类,提供分布创建接口。
public interface PersonBuilder { PersonBuilder buildBasic(String name); PersonBuilder buildOther(String interest); Person build(); }
接下来,接口实现
public class PersonSimpleBuilderImpl implements PersonBuilder { Person person = new Person(); @Override public PersonBuilder buildBasic(String name) { person.setName(name); return this; } @Override public PersonBuilder buildOther(String interest) { person.setInterest(interest); return this; } @Override public Person build() { return person; } }
public class PersonComplexBuilderImpl implements PersonBuilder { Person person = new Person(); @Override public PersonBuilder buildBasic(String name) { person.setName("sys" + name); return this; } @Override public PersonBuilder buildOther(String interest) { person.setInterest(interest); return this; } @Override public Person build() { return person; } }
Director类
public class Director { private PersonBuilder personBuilder; public Director(PersonBuilder personBuilder) { this.personBuilder = personBuilder; } public Person buildPersonBasic(String name){ return personBuilder.buildBasic(name).build(); } public Person buildPersonOther(String other){ return personBuilder.buildOther(other).build(); } }
测试类
public class Test { public static void main(String[] args) { Person person = new PersonSimpleBuilderImpl().buildBasic("张三").buildOther("篮球").build(); System.out.println(person); Person person1 = new PersonComplexBuilderImpl().buildBasic("张三").buildOther("篮球").build(); System.out.println(person1); Director d = new Director(new PersonComplexBuilderImpl()); Person person2 = d.buildPersonBasic("李四"); System.out.println(person2); } }
测试结果:
笔者个人比较喜欢这种链式调用。
创建者模式比较简单,自然而然应用即可,可以不创建Director,直接使用链式编程,具体需要看业务场景。
也许这里的例子不是100%完美,但最重要的是细细体会该设计模式解决的问题。
学习这件事,请不要停下来。