参考—->程杰大神的《大话设计模式》—org
记一下一遍以后重复看时有新的理解,メモ
建造者模式—>将一个复杂对象的构建和它的显示分离,使得同样的构建过程可以创建不同的表示。
UML 图—>
如图示 注重一创建了一个控制类Director帮我去根据客户的要求调用具体实现生产实物的方法。
控制类director和Builder是聚合关系,聚合关系是一种弱的拥有关系,控制类中包括抽象的建造类,但是控制类却不是抽象的建造者类的一部分。
这样用户只需要指定建造的类型就可以得到相应的实物,而具体建造的过程和细节不需知道。
建造者模式是在当创建一个复杂的对象的算法应该独立于该对象的组成部分以及它们的装配方式时
时适用的模式。
根据客户要求去创建一个人,是瘦子还是胖子,然后再瘦子和胖子的类中自己具体构建身体部位。
//构建人体的抽象类,避免构建身体的时候缺少失误(eg:少了胳膊腿啥的-_-)
public abstract class PersonBuilder {
public abstract void buildHead();
public abstract void buildbody();
public abstract void buildArmLeft();
public abstract void buildArmRight();
public abstract void buildLegLeft();
public abstract void buildLegRight();
/**
* 创建人完毕得到的返回创建完的事例对象
* */
public abstract Person getResult();
}
具体的身体构建,胖子类和瘦子类
/**
*
* 创建一個具体胖的人事例对象
* */
public class PersonFatBuilder extends PersonBuilder {
Person person = new Person();
/**
* 创建身体各个部件
* */
@Override
public void buildHead() {
// TODO Auto-generated method stub
person.add("頭");
}
@Override
public void buildbody() {
// TODO Auto-generated method stub
person.add("ぶよぶよ体");
}
@Override
public void buildArmLeft() {
// TODO Auto-generated method stub
person.add("左の腕");
}
@Override
public void buildArmRight() {
// TODO Auto-generated method stub
person.add("右の腕");
}
@Override
public void buildLegLeft() {
// TODO Auto-generated method stub
person.add("左足");
}
@Override
public void buildLegRight() {
// TODO Auto-generated method stub
person.add("右足");
}
/**
* 创建人完毕得到的返回创建完的事例对象
* */
@Override
public Person getResult() {
return person;
}
}
/**
*
* 创建一個具体瘦子的人事例对象
* */
public class PersonThinBuilder extends PersonBuilder {
Person person = new Person();
/**
* 创建身体各个部件
* */
@Override
public void buildHead() {
// TODO Auto-generated method stub
person.add("頭");
}
@Override
public void buildbody() {
// TODO Auto-generated method stub
person.add("痩せてる体");
}
@Override
public void buildArmLeft() {
// TODO Auto-generated method stub
person.add("左の腕");
}
@Override
public void buildArmRight() {
// TODO Auto-generated method stub
person.add("右の腕");
}
@Override
public void buildLegLeft() {
// TODO Auto-generated method stub
person.add("左足");
}
@Override
public void buildLegRight() {
// TODO Auto-generated method stub
person.add("右足");
}
@Override
public Person getResult() {
return person;
}
}
控制类,用来根据客户的要求去调用具体的实现,这样就能降低耦合
public class PersonDirector {
/**
* PersonDirector这个指挥类和PersonBuilder抽象类是聚合关系
* 所谓聚合时一种弱的拥有关系
* 体现的是A对象可以包含B对象,但B对象不是A对象的一部分
* UML标识用空心的菱形实线三角箭头表示
* ◇->
*
* */
// private PersonBuilder personBuilder;
// public PersonDirector(PersonBuilder personBuilder) {
// this.personBuilder = personBuilder;
// }
/**
* 用指挥来建造过程
* */
public void CreatePerson(PersonBuilder personBuilder) {
personBuilder.buildHead();
personBuilder.buildbody();
personBuilder.buildArmLeft();
personBuilder.buildArmRight();
personBuilder.buildLegLeft();
personBuilder.buildLegRight();
}
}
人体类这里主要是用来方便显示构建的人物输出
import java.util.ArrayList;
import java.util.List;
public class Person {
List<String> personList = new ArrayList<String>();
public void add(String shentibuwei) {
personList.add(shentibuwei);
}
/**
* 展示创建的人是什么样的
*
* */
public void show() {
for (int i = 0; i < personList.size(); i++) {
System.out.println(personList.get(i) + "を描く");
}
}
}
客户端要求
public class custom {
public static void main(String[] args) {
// TODO Auto-generated method stub
// Bulid胖子
PersonFatBuilder personFatBuilder = new PersonFatBuilder();
// 创建指挥者的事例
PersonDirector pdFat = new PersonDirector();
// 利用指挥者事例创建一个人,根据用户要求
pdFat.CreatePerson(personFatBuilder);
/**
* 创建人完毕得到的返回创建完的事例对象
* */
Person personFat = personFatBuilder.getResult();
/**
* 展现
* */
personFat.show();
}
}
好处—>
若需要改变一个产品的内部要求表示,则只需要再定义一个具体的建造类继承抽象的Builder类即可。