创建性模式有五种:
1.工厂模式
①简单工厂模式(经常被用到,不属于GoF23种设计模式)
②工厂方法模式
③抽象工厂模式
2.建造者模式
3.原型模式
4.单例模式
建造者模式
将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
角色
1 builder抽象建造者:为创建一个产品对象的各个部件指定抽象接口。
2 ConcreteBuilder具体建造者:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
3 Director指挥者:构造一个使用Builder接口的对象。
4 Product产品角色:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
优缺点
优点
1、将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,使得我们能够更加精确的控制复杂对 象的产生过程。
2、将产品的创建过程与产品本身分离开来,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽 象。
3、每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的 具体建造者,用户使用不同的具体建造者即可得到不同的产品对 象。
缺点
1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合 使用建造者模式,因此其使用范围受到一定的限制。
2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
类图
代码实现
传统方式
Product产品角色
public class Person {
private String head; //必须
private String body; //必须
private String foot; //必须
private String skin; //可选
private String dress; //可选
public Person(String head, String body, String foot) {
this.head = head;
this.body = body;
this.foot = foot;
}
public String getDress() {
return dress;
}
public void setDress(String dress) {
this.dress = dress;
}
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
public String getSkin() {
return skin;
}
public void setSkin(String skin) {
this.skin = skin;
}
}
builder抽象建造者
public abstract class PersonBuilder {
public abstract void skin();
public abstract void dress();
public abstract Person build();
}
ConcreteBuilder具体建造者
public class MyPersonBuilder extends PersonBuilder {
private Person person;
public MyPersonBuilder(String head, String body, String foot) {
person = new Person(head, body, foot);
}
public void skin() {
person.setSkin("黄");
}
@Override
public void dress() {
person.setDress("Hans");
}
public Person build() {
return person;
}
}
public class BlackPersonBuilder extends PersonBuilder {
private Person person;
public BlackPersonBuilder(String head, String body, String foot) {
person = new Person(head, body, foot);
}
public void skin() {
person.setSkin("黑");
}
@Override
public void dress() {
person.setDress("hip-hop");
}
public Person build() {
return person;
}
}
Director指挥者
public class PersonDirector {
public Person build(PersonBuilder personBuilder) {
personBuilder.skin();
personBuilder.dress();
return personBuilder.build();
}
}
测试类
public class RunTest {
public static void main(String[] args) {
PersonBuilder builder = new BlackPersonBuilder("head","body","foot");
PersonDirector director = new PersonDirector();
Person person = director.build(builder);
}
}
上面就是经典的建造者模式的实现方式,实际中一般都是用简化版的建造者模式, 首先其省略了director 这个角色,将这个角色工作交给了client端,具体代码如下:
public class Person {
private String head; //必须
private String body; //必须
private String foot; //必须
private String skin; //可选
private String dress; //可选
private Person(Builder builder) {
this.head = builder.head;
this.body = builder.body;
this.foot = builder.foot;
this.skin = builder.skin;
this.dress = builder.dress;
}
public String getDress() {
return dress;
}
public void setDress(String dress) {
this.dress = dress;
}
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
public String getSkin() {
return skin;
}
public void setSkin(String skin) {
this.skin = skin;
}
public static class Builder{
private String head; //必须
private String body; //必须
private String foot; //必须
private String skin; //可选
private String dress; //可选
public Builder(String head, String body, String foot) {
this.head = head;
this.body = body;
this.foot = foot;
}
public Builder skin(String skin) {
this.skin = skin;
return this;
}
public Builder dress(String dress) {
this.dress = dress;
return this;
}
public Person build(){
return new Person(this);
}
}
public static void main(String[] args) {
Person person = new Builder("HEAD", "BODY", "FOOT").dress("Hans").skin("skin").build();
}
}