一篇帶你了解建造者模式
本文轉(zhuǎn)載自微信公眾號(hào)「我好困啊」,作者mengxin。轉(zhuǎn)載本文請(qǐng)聯(lián)系我好困啊公眾號(hào)。
建造者模式:
將多個(gè)簡(jiǎn)單對(duì)象一步步的按照特定順序創(chuàng)建出一個(gè)復(fù)雜對(duì)象。
意圖
將一個(gè)復(fù)雜對(duì)象的構(gòu)建過(guò)程與其表示分離。
主要解決
主要解決"復(fù)雜對(duì)象"的構(gòu)建構(gòu)成工作,這個(gè)"復(fù)雜對(duì)象"由多個(gè)子對(duì)象按照一定規(guī)則組成。
關(guān)鍵代碼
建造者:將多個(gè)子對(duì)象進(jìn)行組裝。
使用場(chǎng)景
復(fù)雜對(duì)象由多個(gè)子對(duì)象組成。
代碼實(shí)現(xiàn)
代碼主要功能:定義兩個(gè)子對(duì)象cat,dog,將這兩個(gè)子對(duì)象通過(guò)建造者組裝成對(duì)應(yīng)的復(fù)雜對(duì)象pet。
1.定義各類"產(chǎn)品"
構(gòu)建抽象產(chǎn)品接口
- 1/**
- 2 * 抽象商品接口
- 3 */
- 4public interface Item {
- 5
- 6 //商品名稱
- 7 public String name();
- 8 //商品價(jià)格
- 9 public Float price();
- 10 //默認(rèn)行為
- 11 public String canDO();
- 12}
構(gòu)建"cat"產(chǎn)品
- 1/**
- 2 * Cat產(chǎn)品抽象類
- 3 * 提供Cat默認(rèn)行為
- 4 */
- 5public abstract class Cat implements Item{
- 6
- 7 public String canDO(){
- 8 return "miaomiao....";
- 9 }
- 0}
bigCat
- 1/**
- 2 * big cat
- 3 */
- 4public class BigCat extends Cat{
- 5 @Override
- 6 public String name() {
- 7 return "big cat";
- 8 }
- 9
- 10 @Override
- 11 public Float price() {
- 12 return 500.0f;
- 13 }
- 14}
smallCat
- 1public class SmallCat extends Cat{
- 2 @Override
- 3 public String name() {
- 4 return "small cat";
- 5 }
- 6
- 7 @Override
- 8 public Float price() {
- 9 return 100.0f;
- 10 }
- 11}
構(gòu)建"dog"產(chǎn)品
- 1/**
- 2 * Dog產(chǎn)品抽象類
- 3 * 提供dog默認(rèn)行為
- 4 */
- 5public abstract class Dog implements Item{
- 6
- 7 public String canDO(){
- 8 return "wangwang....";
- 9 }
- 0}
bigDog
- 1/**
- 2 * big dog
- 3 */
- 4public class BigDog extends Dog{
- 5 @Override
- 6 public String name() {
- 7 return "big dog";
- 8 }
- 9
- 10 @Override
- 11 public Float price() {
- 12 return 1000.0f;
- 13 }
- 14}
SmallDog
- 1/**
- 2 * small dog
- 3 */
- 4public class SmallDog extends Dog{
- 5 @Override
- 6 public String name() {
- 7 return "small dog";
- 8 }
- 9
- 10 @Override
- 11 public Float price() {
- 12 return 200.0f;
- 13 }
- 14}
2.定義抽象"套餐"
構(gòu)建"pet"套餐
- 1/**
- 2 * 寵物
- 3 */
- 4public class Pet {
- 5
- 6 private List<Item> list = new ArrayList<>();
- 7
- 8 //添加商品
- 9 public void addItem(Item item){
- 10 list.add(item);
- 11 }
- 12
- 13 //獲取所選寵物價(jià)格
- 14 public float getCost(){
- 15 float cost = 0.0f;
- 16 for (Item item : list) {
- 17 cost += item.price();
- 18 }
- 19 return cost;
- 20 }
- 21
- 22 public void showPet(){
- 23 for (Item item : list) {
- 24 System.out.print("Item : "+item.name());
- 25 System.out.print(", speak : "+item.canDO());
- 26 System.out.println(", Price : "+item.price());
- 27 }
- 28 }
- 29
- 30}
3.定義建造者將"產(chǎn)品"按照特定順序構(gòu)建成特定"套餐"
構(gòu)建創(chuàng)建者,創(chuàng)建對(duì)應(yīng)"套餐"
- 1/**
- 2 * 建造者:
- 3 * 將現(xiàn)有的商品按照特點(diǎn)順序組裝成特定"套裝"
- 4 */
- 5public class PetBuilder {
- 6
- 7 //組裝大寵物套裝
- 8 public Pet buildBigPet(){
- 9 Pet pet = new Pet();
- 10 pet.addItem(new BigCat());
- 11 pet.addItem(new BigDog());
- 12 return pet;
- 13 }
- 14
- 15 //組裝小寵物套裝
- 16 public Pet buildSmallPet(){
- 17 Pet pet = new Pet();
- 18 pet.addItem(new SmallDog());
- 19 pet.addItem(new SmallCat());
- 20 return pet;
- 21 }
- 22
- 23}
測(cè)試:
- 1/**
- 2 * 測(cè)試建造者模式
- 3 */
- 4public class Main {
- 5
- 6 public static void main(String[] args) {
- 7 PetBuilder petBuilder = new PetBuilder();
- 8 //調(diào)用建造者構(gòu)建Big套裝
- 9 Pet bigPet = petBuilder.buildBigPet();
- 10 System.out.println("Big pet....");
- 11 bigPet.showPet();
- 12 System.out.println("Total cost:"+bigPet.getCost());
- 13
- 14 //調(diào)用建造者構(gòu)建Small套裝
- 15 Pet smallPet = petBuilder.buildSmallPet();
- 16 System.out.println("Small pet....");
- 17 smallPet.showPet();
- 18 System.out.println("Total cost:"+smallPet.getCost());
- 19 }
- 20}
注意事項(xiàng):與工廠模式的區(qū)別是:建造者模式更加關(guān)注與零件裝配的順序。