摘要:代碼實例我們通常構造一個有很多參數的對象時有三種方式構造器重載,模式和模式。很明顯這種構造器重載的方式對于多屬性的情況是不完美的。方式方式就是提供方法,在使用的時候根據需求先調用無參構造器再調用方法填充屬性值。
Java設計模式之builder模式
今天學mybatis的時候,知道了SQLSessionFactory使用的是builder模式來生成的。再次整理一下什么是builder模式以及應用場景。
1. builder簡介builder模式也叫建造者模式,builder模式的作用將一個復雜對象的構建與他的表示分離,使用者可以一步一步的構建一個比較復雜的對象。
2. 代碼實例我們通常構造一個有很多參數的對象時有三種方式:構造器重載,JavaBeans模式和builder模式。通過一個小例子我們來看一下builder模式的優勢。
2.1 構造器重載方式package com.wangjun.designPattern.builder; public class Product { private int id; private String name; private int type; private float price; public Product() { super(); } public Product(int id) { super(); this.id = id; } public Product(int id, String name) { super(); this.id = id; this.name = name; } public Product(int id, String name, int type) { super(); this.id = id; this.name = name; this.type = type; } public Product(int id, String name, int type, float price) { super(); this.id = id; this.name = name; this.type = type; this.price = price; } }
使用構造器重載我們需要定義很多構造器,為了應對使用者不同的需求(有些可能只需要id,有些需要id和name,有些只需要name,......),理論上我們需要定義2^4 = 16個構造器,這只是4個參數,如果參數更多的話,那將是指數級增長,肯定是不合理的。要么你定義一個全部參數的構造器,使用者只能多傳入一些不需要的屬性值來匹配你的構造器。很明顯這種構造器重載的方式對于多屬性的情況是不完美的。
2.2 JavaBeans方式package com.wangjun.designPattern.builder; public class Product2 { private int id; private String name; private int type; private float price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getType() { return type; } public void setType(int type) { this.type = type; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } }
JavaBeans方式就是提供setter方法,在使用的時候根據需求先調用無參構造器再調用setter方法填充屬性值。
Product2 p2 = new Product2(); p2.setId(10); p2.setName("phone"); p2.setPrice(100); p2.setType(1);
這種方式彌補了構造器重載的不足,創建實例很容易,代碼讀起來也很容易。但是,因為構造過程被分到了幾個調用中,在構造過程中JavaBeans可能處于不一致的狀態,類無法僅僅通過檢驗構造器參數的有效性來保證一致性。
2.3 builder模式package com.wangjun.designPattern.builder; public class Product3 { private final int id; private final String name; private final int type; private final float price; private Product3(Builder builder) { this.id = builder.id; this.name = builder.name; this.type = builder.type; this.price = builder.price; } public static class Builder { private int id; private String name; private int type; private float price; public Builder id(int id) { this.id = id; return this; } public Builder name(String name) { this.name = name; return this; } public Builder type(int type) { this.type = type; return this; } public Builder price(float price) { this.price = price; return this; } public Product3 build() { return new Product3(this); } } }
可以看到builder模式將屬性定義為不可變的,然后定義一個內部靜態類Builder來構建屬性,再通過一個只有Builder參數的構造器來生成Product對象。Builder的setter方法返回builder本身,以便可以將屬性連接起來。我們就可以像下面這樣使用了。
Product3 p3 = new Product3.Builder() .id(10) .name("phone") .price(100) .type(1) .build();
當然具體使用builder的情況肯定沒有這么簡單,但是思路大致一樣:先通過某種方式取得構造對象需要的所有參數,再通過這些參數一次性構建這個對象。比如MyBatis中SqlSessionFactoryBuilder就是通過讀取MyBatis的xml配置文件來獲取構造SqlSessionFactory所需要的參數的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77256.html
摘要:參考文章設計模式之建造者模式一什么是建造者模式建造者模式是將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 參考文章:java設計模式之建造者模式 一、什么是建造者模式建造者模式:是將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。工廠類模式提供的是創建單個類的模式,而建造者模式則是將各種產品集中起來進行管理,用來創建復合對象,所謂...
摘要:上期原型模式發布以后,收到了粉絲的感謝,一條創作的動力更足了。今天我們一塊看一下建造者模式,同樣是創建型設計模式。為我們提供了建造者模式的快速實現,要應用到實際編碼中。 ...
摘要:在建造者模式比較龐大時,導演類可以有多個。該種場景只能是一個補償方法,因為一個對象不容易獲得,而在設計階段竟然沒有發覺,而要通過創建者模式柔化創建過程,本身已經違反設計的最初目標。源碼地址參考文獻設計模式之禪 定義 Separate the construction of a complex object from its representation so that the same...
摘要:建造者實現抽象類的所有未實現的方法,具體來說一般是兩項任務組建產品返回組建好的產品。 0x01.定義與類型 定義:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 用戶只需指定需要建造的類型就可以得到他們,建造過程及細節不需要知道 類型:創建型 實現建造模式的兩種方式 1.抽象建造者 UML: showImg(https://segmentfault.co...
摘要:而建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是通過組裝零配件而產生一個新產品。最后通過一個套餐實例,介紹了建造者模式在實例中的基本使用手段。 歷史文章回顧: 設計模式專欄 深入理解單例模式 深入理解工廠模式 歷史優質文章推薦: 分布式系統的經典基礎理論 可能是最漂亮的Spring事務管理詳解 面試中關于Java虛擬機(jvm)的問題看這篇就夠了 無論是在現實世界中還是在軟件...
閱讀 1379·2023-04-25 18:34
閱讀 3437·2021-11-19 09:40
閱讀 2824·2021-11-17 09:33
閱讀 2935·2021-11-12 10:36
閱讀 2823·2021-09-26 09:55
閱讀 2653·2021-08-05 10:03
閱讀 2512·2019-08-30 15:54
閱讀 2861·2019-08-30 15:54