【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
生活随笔
收集整理的這篇文章主要介紹了
【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、建造者模式簡介
- 二、建造者模式適用場景
- 三、建造者模式優缺點
- 四、建造者模式與工廠模式
- 五、建造者模式代碼示例
- 1、學生類
- 2、建造者抽象類
- 3、建造者實現類
- 4、教師類 ( 非必須 )
- 5、測試類
- 六、實例類和建造者類定義在同一個類中 ( 建造者模式常用用法 )
- 1、實例類 + 建造者類
- 2、測試類
一、建造者模式簡介
建造者模式 : 將 一個復雜對象 的 構建過程 與其 表示 分離 , 使得 同樣的構建過程 , 可以 創建不同的表示 ;
用戶只需要 指定 需要建造的類型 就可以 得到該類型對應的產品實例 , 不關心建造過程細節 ;
建造者模式就是 如何逐步構建包含多個組件的對象 , 相同的構建過程 , 可以創建不同的產品 ,
建造者模式類型 : 創建型 ;
二、建造者模式適用場景
建造者模式適用場景 :
- 結構復雜 : 對象 有 非常復雜的內部結構 , 有很多屬性 ;
- 分離創建和使用 : 想把 復雜對象 的 創建 和 使用 分離 ;
當創造一個對象 需要很多步驟時 , 適合使用建造者模式 ;
當創造一個對象 只需要一個簡單的方法就可以完成 , 適合使用工廠模式 ;
三、建造者模式優缺點
建造者模式優點 :
- 封裝性好 : 創建 和 使用 分離 ;
- 擴展性好 : 建造類之間 相互獨立 , 在 一定程度上解耦 ;
建造者模式缺點 :
- 增加類數量 : 產生多余的 Builder 對象 ;
- 內部修改困難 : 如果 產品內部發生變化 , 建造者也要相應修改 ;
四、建造者模式與工廠模式
建造者模式 與 工廠模式 :
- 注重點不同 : 建造者模式 更注重于 方法的調用順序 ; 工廠模式 注重于 創建產品 , 不關心方法調用的順序 ;
- 創建對象力度不同 : 創建對象的力度不同 , 建造者模式可以創建復雜的產品 , 由各種復雜的部件組成 , 工廠模式創建出來的都是相同的實例對象 ,
五、建造者模式代碼示例
1、學生類
package builder;/*** 學生類*/ public class Student {private String name;private String age;private String number;private String address;private String school;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getSchool() {return school;}public void setSchool(String school) {this.school = school;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age='" + age + '\'' +", number='" + number + '\'' +", address='" + address + '\'' +", school='" + school + '\'' +'}';} }
2、建造者抽象類
package builder;/*** 抽象建造者*/ public abstract class StudentBuilder {public abstract void buildName(String name);public abstract void buildAge(String age);public abstract void buildNumber(String number);public abstract void buildAddress(String address);public abstract void buildSchool(String school);public abstract Student makeCourse(); }
3、建造者實現類
package builder;/*** 建造者實現類*/ public class StudentBuilderImpl extends StudentBuilder {private Student student = new Student();@Overridepublic void buildName(String name) {this.student.setName(name);}@Overridepublic void buildAge(String age) {this.student.setAge(age);}@Overridepublic void buildNumber(String number) {this.student.setNumber(number);}@Overridepublic void buildAddress(String address) {this.student.setAddress(address);}@Overridepublic void buildSchool(String school) {this.student.setSchool(school);}@Overridepublic Student makeCourse() {return this.student;} }
4、教師類 ( 非必須 )
package builder;/*** 教師類 , 負責使用建造者創建學生信息*/ public class Teacher {/*** 持有學生建造者*/private StudentBuilder studentBuilder;/*** 構造函數注入建造者* @param studentBuilder*/public Teacher(StudentBuilder studentBuilder) {this.studentBuilder = studentBuilder;}/*** 調用建造者對象創建 學生 實例對象* @param name* @param age* @param number* @param address* @param school* @return*/public Student makeStudent(String name, String age,String number, String address,String school) {this.studentBuilder.buildName(name);this.studentBuilder.buildAge(age);this.studentBuilder.buildNumber(number);this.studentBuilder.buildAddress(address);this.studentBuilder.buildSchool(school);return this.studentBuilder.makeCourse();} }
5、測試類
package builder;public class Main {public static void main(String[] args) {// 創建學生對象建造者StudentBuilder studentBuilder = new StudentBuilderImpl();// 創建教師對象Teacher teacher = new Teacher(studentBuilder);// 教師對象使用學生建造者創建學生 實例對象Student student = teacher.makeStudent("小明","12" ,"1","學院路","第一小學");System.out.println(student);} }
執行結果 :
Student{name='小明', age='12', number='1', address='學院路', school='第一小學'}六、實例類和建造者類定義在同一個類中 ( 建造者模式常用用法 )
1、實例類 + 建造者類
package builder2;/*** 學生類*/ public class Student {private String name;private String age;private String number;private String address;private String school;public Student(StudentBuilder builder) {this.name = builder.name;this.age = builder.age;this.number = builder.number;this.address = builder.address;this.school = builder.school;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getSchool() {return school;}public void setSchool(String school) {this.school = school;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age='" + age + '\'' +", number='" + number + '\'' +", address='" + address + '\'' +", school='" + school + '\'' +'}';}/*** 使用靜態內部類作為創建者* 將具體的業務類 及其 創建者 定義在一個類中* 使用鏈式調用 , 每個 build 步驟都返回創建者本身*/public static class StudentBuilder {private String name;private String age;private String number;private String address;private String school;public StudentBuilder buildName(String name) {this.name = name;return this;}public StudentBuilder buildAge(String age) {this.age = age;return this;}public StudentBuilder buildNumber(String number) {this.number = number;return this;}public StudentBuilder buildAddress(String address) {this.address = address;return this;}public StudentBuilder buildSchool(String school) {this.school = school;return this;}public Student build() {return new Student(this);}} }
2、測試類
package builder2;public class Main {public static void main(String[] args) {// 使用鏈式調用 , 一行代碼創建實例對象Student student = new Student.StudentBuilder().buildName("小明").buildAge("12").buildNumber("1").buildAddress("學院路").buildSchool("第一小學").build();System.out.println(student);} }
執行結果 :
Student{name='小明', age='12', number='1', address='學院路', school='第一小學'}總結
以上是生活随笔為你收集整理的【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【设计模式】抽象工厂模式 ( 简介 |
- 下一篇: 【Google Play】正式版上架流程