Separate the construction of a complex object from its representation so that the same construction process can create different representations.
將一個複雜的對象的建造過程與他的表示分離,使得同樣的建造過程可以創建不同的表示。
題目:
請用生成器模式(BUILDER)設計一個小人玩具生產線,具體描述如下:
現階段小人玩具生產線需要生成小頭爸爸玩具和大頭兒子玩具共2種,在將來可能會增加新人物。
其中小頭爸爸玩具包含“小的頭”, “強壯的身體”, “長的左手”, “長的右手”, “長的左腳”, “長的右腳”6個部分;
大頭兒子玩具包含“大的頭”, “小小的身體”, “短的左手”, “短的右手”, “短的左腳”, “短的右腳”6個部分;
爲了玩具組裝方便,6個部分的生產順序爲:身體(body)->頭(head)->左手(armLeft)->右手(armRight)->左腳(legLeft)->右腳(LegRight)
題目中小人每一部分的生產只需要通過輸出語句表示即可,比如:生成了長的左手,就用輸出語句輸出“長的左手”即可
UML類圖:
GitHub源碼:https://github.com/YEN-GitHub/PatternDemo/tree/master/src/CreationalPattern/builder
package CreationalPattern.builder.demo1;
import java.util.ArrayList;
/**
* Created by yangenneng on 2017-04-05 11:17
* Abstract:人
*/
public class Person {
private ArrayList<String> pParts=new ArrayList<>();
private ArrayList<String> pPartName=new ArrayList<String>(){{add("頭");add("身體");add("手");add("腳");}};
public void addPart(String partValue){//增加身體的一部分
pParts.add(partValue);
}
public void ShowPerson(){
System.out.println("小人的整體結構爲:");
for (int i = 0; i < pPartName.size(); i++) {
System.out.println(pPartName.get(i)+":"+pParts.get(i));
}
}
}
package CreationalPattern.builder.demo1;
/**
* Created by yangenneng on 2017-04-05 11:27
* Abstract:
*/
public interface IBuilder {
void buildHead();//頭
void buildBody();//身體
void buildArm();//手
void buildLeg();//腳
}
package CreationalPattern.builder.demo1;
/**
* Created by yangenneng on 2017-04-05 11:28
* Abstract:瘦子
*/
public class ThinPerson implements IBuilder {
Person person=new Person();
@Override
public void buildHead() {
person.addPart("方的");
}
@Override
public void buildBody() {
person.addPart("瘦的");
}
@Override
public void buildArm() {
person.addPart("短的");
}
@Override
public void buildLeg() {
person.addPart("細的");
}
public Person getPerson(){return person;}
}
package CreationalPattern.builder.demo1;
/**
* Created by yangenneng on 2017-04-05 11:30
* Abstract:胖子
*/
public class FatPerson implements IBuilder {
Person person=new Person();
@Override
public void buildHead() {
person.addPart("圓的");
}
@Override
public void buildBody() {
person.addPart("胖的");
}
@Override
public void buildArm() {
person.addPart("長的");
}
@Override
public void buildLeg() {
person.addPart("粗的");
}
public Person getPerson(){return person;}
}
package CreationalPattern.builder.demo1;
/**
* Created by yangenneng on 2017-04-05 11:34
* Abstract:
*/
public class PersonDirector {
public void builderP(IBuilder iBuilder) {
iBuilder.buildHead();
iBuilder.buildBody();
iBuilder.buildArm();
iBuilder.buildLeg();
}
}
package CreationalPattern.builder.demo1;
/**
* Created by yangenneng on 2017-04-05 11:31
* Abstract:
*/
public class Client {
public static void main(String[] args) {
Person person=null;
System.out.println("--------------創建一個胖子---------------------");
FatPerson fatPerson=new FatPerson();
new PersonDirector().builderP(fatPerson);
person=fatPerson.getPerson();
person.ShowPerson();
System.out.println("--------------創建一個瘦子---------------------");
ThinPerson thinPerson=new ThinPerson();
new PersonDirector().builderP(thinPerson);
person=thinPerson.getPerson();
person.ShowPerson();
}
}