JAVA設(shè)計(jì)模式之簡(jiǎn)單粗暴學(xué)建造者模式
將一個(gè)復(fù)雜對(duì)象的構(gòu)建和它的表示分離摹迷,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
建造者有以下角色:
- 導(dǎo)演類:負(fù)責(zé)安排已有模塊的安裝順序孤荣,最后通知建造者開始建造甸陌。
- 建造者:抽象Builder類,用于規(guī)范產(chǎn)品的組建盐股。
- 具體建造者:實(shí)現(xiàn)抽象Builder類的所有方法钱豁,并返回建造好的對(duì)象。
- 產(chǎn)品類疯汁。
簡(jiǎn)單示例
1牲尺、產(chǎn)品類
public class MobilePhone {
//手機(jī)屏幕
private String screen;
//電池
private String battery;
//話筒
private String microphone;
//聽筒
private String phoneReceiver;
//機(jī)身
private String phoneBody;
public String getScreen() {
return screen;
}
public void setScreen(String screen) {
this.screen = screen;
}
public String getBattery() {
return battery;
}
public void setBattery(String battery) {
this.battery = battery;
}
public String getMicrophone() {
return microphone;
}
public void setMicrophone(String microphone) {
this.microphone = microphone;
}
public String getPhoneReceiver() {
return phoneReceiver;
}
public void setPhoneReceiver(String phoneReceiver) {
this.phoneReceiver = phoneReceiver;
}
public String getPhoneBody() {
return phoneBody;
}
public void setPhoneBody(String phoneBody) {
this.phoneBody = phoneBody;
}
@Override
public String toString() {
return "MobilePhone{" +
"screen='" + screen + '\'' +
", battery='" + battery + '\'' +
", microphone='" + microphone + '\'' +
", phoneReceiver='" + phoneReceiver + '\'' +
", phoneBody='" + phoneBody + '\'' +
'}';
}
}
2、抽象建造者
public interface IBuildMobilePhoneBuilder {
/**
* 建造手機(jī)屏幕
*/
void buildScreen();
/**
* 建造手機(jī)電池
*/
void buildBattery();
/**
* 建造手機(jī)聽筒
*/
void buildMicrophone();
/**
* 建造手機(jī)話筒
*/
void buildPhoneReceiver();
/**
* 建造手機(jī)機(jī)身
*/
void buildPhoneBody();
MobilePhone build();
}
3、具體建造者
public class IPhoneXBuilder implements IBuildMobilePhoneBuilder {
private MobilePhone mobilePhone;
public IPhoneXBuilder(){
mobilePhone = new MobilePhone();
}
/**
* 建造手機(jī)屏幕
*/
@Override
public void buildScreen() {
mobilePhone.setScreen("OLED顯示屏");
}
/**
* 建造手機(jī)電池
*/
@Override
public void buildBattery() {
mobilePhone.setBattery("2700mAh電池容量");
}
/**
* 建造手機(jī)聽筒
*/
@Override
public void buildMicrophone() {
mobilePhone.setMicrophone("聽筒");
}
/**
* 建造手機(jī)話筒
*/
@Override
public void buildPhoneReceiver() {
mobilePhone.setPhoneReceiver("話筒");
}
/**
* 建造手機(jī)機(jī)身
*/
@Override
public void buildPhoneBody() {
mobilePhone.setPhoneBody("iphoneX機(jī)身");
}
/**
* 創(chuàng)建手機(jī)
* @return
*/
public MobilePhone build(){
return mobilePhone;
}
}
4谤碳、導(dǎo)演類
public class Director {
/**
* 建造一部手機(jī)
* @param buildPhone
* @return
*/
public MobilePhone createMobilePhone(IBuildMobilePhoneBuilder buildPhone){
buildPhone.buildBattery();
buildPhone.buildMicrophone();
buildPhone.buildScreen();
buildPhone.buildPhoneReceiver();
buildPhone.buildPhoneBody();
return buildPhone.build();
}
}
- 屏蔽產(chǎn)品內(nèi)部組成細(xì)節(jié)溃卡。
- 具體建造者類之間相互獨(dú)立,容易擴(kuò)展蜒简。
- 會(huì)產(chǎn)生多余的建造者對(duì)象和導(dǎo)演類瘸羡。
另一種實(shí)現(xiàn)方式:
public class Student {
String name = null;
int number = -1;
String sex = null;
int age = -1;
String school = null;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", number=" + number +
", sex='" + sex + '\'' +
", age=" + age +
", school='" + school + '\'' +
'}';
}
//構(gòu)建器,利用構(gòu)建器作為參數(shù)來(lái)構(gòu)建Student對(duì)象
public static class StudentBuilder {
String name = null;
int number = -1;
String sex = null;
int age = -1;
String school = null;
public StudentBuilder setName(String name) {
this.name = name;
return this;
}
public StudentBuilder setNumber(int number) {
this.number = number;
return this;
}
public StudentBuilder setSex(String sex) {
this.sex = sex;
return this;
}
public StudentBuilder setAge(int age) {
this.age = age;
return this;
}
public StudentBuilder setSchool(String school) {
this.school = school;
return this;
}
public Student build() {
return new Student(this);
}
}
public Student(StudentBuilder builder) {
this.age = builder.age;
this.name = builder.name;
this.number = builder.number;
this.school = builder.school;
this.sex = builder.sex;
}
}
@Test
public void thatTest(){
// System.out.println(new Director().createMobilePhone(new IPhoneXBuilder()));
Student a = new Student.StudentBuilder().setAge(13).setName("LiHua").build();
Student b = new Student.StudentBuilder().setSchool("sc").setSex("Male").setName("ZhangSan").build();
System.out.println(a);
System.out.println(b);
}