建造者模式
主要參考了 /冰鑒/ 的一篇博客滋早,覺得寫的很詳細(xì)恳守,然后自己敲了一遍考婴。學(xué)習(xí)了 設(shè)計(jì)模式之建造者模式, 并做了一些筆記催烘。
建造者模式簡(jiǎn)介
建造者模式(Buidler Pattern)又叫生成器模式沥阱, 將一個(gè)復(fù)雜對(duì)象的構(gòu)建和它的表示分離開,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
建造者模式有點(diǎn)
- 封裝性:不必知道實(shí)現(xiàn)的細(xì)節(jié)伊群,直接得到產(chǎn)品
- 擴(kuò)展性:Builder類相互獨(dú)立考杉,方便以后擴(kuò)展
- 安全性:每個(gè)產(chǎn)品相互獨(dú)立策精,建造的過(guò)程不會(huì)對(duì)其他產(chǎn)生影響
建造模式步驟以及實(shí)現(xiàn)
-
創(chuàng)建產(chǎn)品類,是所有產(chǎn)品的父類崇棠⊙释啵可以產(chǎn)生一個(gè)或多個(gè)產(chǎn)品,但是實(shí)現(xiàn)的接口可以完全不相關(guān)枕稀。
public class Person { private String name; //姓名 private int age; //年齡 private String work; //工作 public String getWork () { return work; } public void setWork (String work) { this.work = work; } public String getName () { return name; } public void setName (String name) { this.name = name; } public int getAge () { return age; } public void setAge (int age) { this.age = age; } }
-
由父類生成兩個(gè)子產(chǎn)品
Student:
public class Student extends Person { private String sex = "man"; //性別 public Student () { this.setWork("student"); } public String getSex () { return sex; } public void setSex (String sex) { this.sex = sex; } @Override public String toString () { return "職業(yè):\t" + this.getWork() + "\n性別:\t" + this.getSex() + "\n姓名:\t" + this.getName() + "\n年齡:\t" + this.getAge(); } }
Teather
public class Teatcher extends Person { private String sex; //性別 public Teatcher () { this.setWork("teacher"); } public String getSex () { return sex; } public void setSex (String sex) { this.sex = sex; } @Override public String toString () { return "職業(yè):\t" + this.getWork() + "\n性別:\t" + this.getSex() + "\n姓名:\t" + this.getName() + "\n年齡:\t" + this.getAge(); } }
-
創(chuàng)建接口询刹,其中聲明生產(chǎn)產(chǎn)品需要的方法
public interface PersonBuilder { void buildName(); //制造姓名 void buildAge(); //制造年齡 void buildSex(); //制造性別 Person getResult(); //返回產(chǎn)品 }
-
創(chuàng)建具體的建造類,開始生產(chǎn)產(chǎn)品啦...
制造學(xué)生
public class StudentBuilder implements PersonBuilder { private Student stu = new Student(); @Override public void buildName () { stu.setName("a"); } @Override public void buildAge () { stu.setAge(12); } @Override public void buildSex () { stu.setSex("man"); } @Override public Person getResult () { return stu; } }
制造教師
public class TeatcherBuilder implements PersonBuilder { private Teatcher teatcher = new Teatcher(); @Override public void buildName () { teatcher.setName("b"); } @Override public void buildAge () { teatcher.setAge(23); } @Override public void buildSex () { teatcher.setSex("woman"); } @Override public Person getResult () { return teatcher; } }
-
創(chuàng)建導(dǎo)演類萎坷,將制造過(guò)程放進(jìn)去
public class PersonDirector { private PersonBuilder builder; //制造學(xué)生 public Student constructStudent(){ builder = new StudentBuilder(); builder.buildAge(); builder.buildName(); builder.buildSex(); //產(chǎn)品生產(chǎn)完成凹联,將產(chǎn)品返回出去 return (Student) builder.getResult(); } //制造老師 public Teatcher constructTeacher(){ builder = new TeatcherBuilder(); builder.buildAge(); builder.buildName(); builder.buildSex(); return (Teatcher) builder.getResult(); } }
-
最后進(jìn)行測(cè)試,看能不能創(chuàng)建成功
PersonDirector director = new PersonDirector(); //生產(chǎn)學(xué)生 Student student = director.constructStudent(); Log.i(TAG, student.toString()); //生產(chǎn)老師 Teatcher teatcher = director.constructTeacher(); Log.i(TAG, teatcher.toString());
結(jié)果打印
01-04 14:10:31.907 2565-2565/xiaweizi.com.net I/MainActivity--->: 職業(yè): student
性別: man
姓名: a
年齡: 12
01-04 14:10:31.907 2565-2565/xiaweizi.com.net I/MainActivity--->: 職業(yè): teacher
性別: woman
姓名: b
年齡: 23
其實(shí)Dialog的鏈?zhǔn)绞褂每梢圆捎媒ㄔ煺吣J絹?lái)完成
public class MyDialog {
//警告框標(biāo)題
private String title;
//警告框圖標(biāo)資源ID
private int iconId;
//上線文
private Context context;
public String getTitle () {
return title;
}
public int getIconId () {
return iconId;
}
public Context getContext () {
return context;
}
public static class Builder{
//給自己的dialog設(shè)置默認(rèn)內(nèi)容
private String title = "title";
private int iconId = 0;
private Context context;
public Builder (Context context) {
this.context = context;
}
public Builder setTitle(String title){
this.title = title;
return this;
}
public Builder setIconId(int iconId){
this.iconId = iconId;
return this;
}
//應(yīng)用自己的配置
private void applyConfig(MyDialog myDialog){
myDialog.title = title;
myDialog.iconId = iconId;
myDialog.context = context;
}
public MyDialog show(){
MyDialog myDialog = new MyDialog();
applyConfig(myDialog);
return myDialog;
}
}
}
#######使用就簡(jiǎn)單了
MyDialog myDialog =
new MyDialog.Builder(this).setTitle("標(biāo)題").setIconId(R.mipmap.ic_launcher).show();
最后還是很感謝 大神的文章哆档,本篇文章作為個(gè)人筆記蔽挠,有點(diǎn)局限,易于理解瓜浸,方便事后查看象泵。