最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java設計模式之建造者模式學習

 更新時間:2014年01月12日 09:28:09   投稿:zxhpj  
建造者模式(Builder Pattern)主要用于“分步驟構(gòu)建一個復雜的對象”,在這其中“分步驟”是一個穩(wěn)定的算法,下面給出了詳細的示例

1 概述
建造者模式(Builder Pattern)主要用于“分步驟構(gòu)建一個復雜的對象”,在這其中“分步驟”是一個穩(wěn)定的算法,而復雜對象的各個部分則經(jīng)常變化。因此, 建造者模式主要用來解決“對象部分”的需求變化。 這樣可以對對象構(gòu)造的過程進行更加精細的控制。

2 示例
以生產(chǎn)手機為例,每個手機分為屏幕Screen、CPU、Battery。

 蘋果:

 

復制代碼 代碼如下:

 package org.scott.builder.before.use;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Scott
 * @version 2013-11-20
 * @description
 */
public class ApplePhone {
    List<String> parts = new ArrayList<String>();
   
    public void createCPU() {
        parts.add("CUP: Qualcomm");
    }

    public void createScreen() {
        parts.add("SCREEN: JDI");
    }
   
    public void createBattery() {
        parts.add("BATTERY: DeSai");
    }
   
    public void show(){
        System.out.print("產(chǎn)品部件信息:");
        for(String part : parts){
            System.out.print(part + "\t");
        }
    }
}
 

 三星:

 

復制代碼 代碼如下:

 package org.scott.builder.before.use;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Scott
 * @version 2013-11-20
 * @description
 */
public class SamsungPhone {
    List<String> parts = new ArrayList<String>();
   
    public void createCPU() {
        parts.add("CUP: MTK");
    }

    public void createScreen() {
        parts.add("SCREEN: Samsung");
    }
   
    public void createBattery() {
        parts.add("BATTERY: DeSai");
    }
   
    public void show(){
        System.out.print("產(chǎn)品部件信息:");
        for(String part : parts){
            System.out.print(part + "\t");
        }
    }
}
 

測試客戶端:

復制代碼 代碼如下:

package org.scott.builder.before.use;
/**
 * @author Scott
 * @version 2013-11-20
 * @description
 */
public class BuilerTest {
    private static ApplePhone iphone = new ApplePhone();
    private static SamsungPhone samPhone = new SamsungPhone();
   
    public static void main(String args[]){
        iphone.createCPU();
        iphone.createScreen();
        iphone.createBattery();
        iphone.show();
       
        samPhone.createCPU();
        samPhone.createScreen();
        samPhone.createBattery();
        samPhone.show();
    }
}

是不是發(fā)現(xiàn)個問題?那就是生產(chǎn)手機的每一道工序都是一樣的,確切的說是工序名稱一樣,只是具體的每個工序的處理不同,工序是不變的,就這么幾步,每道工序的具體處理是變化的,由此,我們可以把不變的抽取出來,以“不變應萬變”,將變化的,交給具體的產(chǎn)品來做。
具體怎么做?這回的Builder模式派上用場了。

首先來個Phone的接口:

復制代碼 代碼如下:

package org.scott.builder.after.use;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Scott
 * @version 2013-11-20
 * @description
 */
public abstract class Phone {
    protected List<String> parts = new ArrayList<String>();
   
    public void add(String part){
        parts.add(part);
    }

    public void show(){
        System.out.print("產(chǎn)品部件信息:");
        for(String part : parts){
            System.out.print(part + "\t");
        }
    }
}

蘋果手機類:

復制代碼 代碼如下:

package org.scott.builder.after.use;
/**
 * @author Scott
 * @version 2013-11-20
 * @description
 */
public class ApplePhone extends Phone{

}

三星手機類:

復制代碼 代碼如下:

package org.scott.builder.after.use;
/**
 * @author Scott
 * @version 2013-11-20
 * @description
 */
public class SamsungPhone extends Phone{

}

再定義個生產(chǎn)步驟的接口Builder:

復制代碼 代碼如下:

package org.scott.builder.after.use;
/**
 * @author Scott
 * @version 2013-11-20
 * @description
 */
public interface Builder {
    public void buildCPU();
   
    public void buildScreen();
   
    public void buildBattery();
   
    public Phone getPhone();
}

蘋果手機的Builder:

復制代碼 代碼如下:

package org.scott.builder.after.use;
/**
 * @author Scott
 * @version 2013-11-20
 * @description
 */
public class ApplePhoneBuilder implements Builder{
    private Phone phone = new ApplePhone();
   
    @Override
    public void buildCPU() {
        phone.add("CUP: Qualcomm");
    }

    @Override
    public void buildScreen() {
        phone.add("SCREEN: JDI");
    }

    @Override
    public void buildBattery() {
        phone.add("BATTERY: DeSai");
    }

    @Override
    public Phone getPhone() {
        return phone;
    }

}

三星手機的Builder:

復制代碼 代碼如下:

package org.scott.builder.after.use;
/**
 * @author Scott
 * @version 2013-11-20
 * @description
 */
public class SamsungPhoneBuilder implements Builder{
   
    private Phone phone = new SamsungPhone();
   
    @Override
    public void buildCPU() {
        phone.add("CUP: MTK");       
    }

    @Override
    public void buildScreen() {
        phone.add("SCREEN: Samsung");
    }

    @Override
    public void buildBattery() {
        phone.add("BATTERY: DeSai");       
    }

    @Override
    public Phone getPhone() {
        return phone;
    }

}

指導具體生產(chǎn)手機的Director:

復制代碼 代碼如下:

package org.scott.builder.after.use;
/**
 * @author Scott
 * @version 2013-11-20
 * @description
 */
public class Director {
    private Builder builder;
   
    public Director(Builder builder){
        this.builder = builder;
    }
   
    public void construct(){
        builder.buildCPU();
        builder.buildScreen();
        builder.buildBattery();
    }
}

最后寫個測試類:

復制代碼 代碼如下:

package org.scott.builder.after.use;
/**
 * @author Scott
 * @version 2013-11-20
 * @description
 */
public class BuilderTest {

    private static Builder iPhoneBuilder = new ApplePhoneBuilder();
    private static Builder samPhoneBuilder  = new SamsungPhoneBuilder();
   
    public static void main(String[] args) {
        Director director = new Director(iPhoneBuilder);
        director.construct();
        Phone phone = iPhoneBuilder.getPhone();
        System.out.println("iphone");
        phone.show();
       
        director = new Director(samPhoneBuilder);
        director.construct();
        phone = samPhoneBuilder.getPhone();
        System.out.println("\nsamSung");
        phone.show();
    }

}

運行結(jié)果:

復制代碼 代碼如下:

iphone
產(chǎn)品部件信息:CUP: Qualcomm    SCREEN: JDI    BATTERY: DeSai   
samSung
那產(chǎn)品部件信息:CUP: MTK    SCREEN: Samsung    BATTERY: DeSai

這里的兩個Phone實體類是空的,如果是這種情況,那么它們可以省略掉,如果 Phone接口也可以被省略掉,最終剩下的就只有 Director、Builder、和具體的 Bulider 實現(xiàn)類。并且,ApplePhone類和 SamsungPhone類是有關系的兩個類,它們不同的手機品牌,如果遇到兩個或多個沒有太多關系的類,公共的接口Phone就沒有存在的必要,但是這時候,那么 Builder 接口的規(guī)定的 getPhone() 方法的返回值怎么確定呢?

  無論返回值類型是 ApplePhone還是SamsungPhone,都會產(chǎn)生問題,因為返回結(jié)果的類型不統(tǒng)一。此時,可以將 Phone定義成一個空接口(不包含任何方法的接口),再讓這些沒有相互關系的具體產(chǎn)品類都去實現(xiàn)這個接口,那么 Builder 接口里面規(guī)定的 getPhone() 方法的返回值類型依然是 Phone 類型,就解決問題了。不過這種情況下,也就沒有使用Builder模式的必要了。

相關文章

  • Mybatis讀取和存儲json類型數(shù)據(jù)的實現(xiàn)

    Mybatis讀取和存儲json類型數(shù)據(jù)的實現(xiàn)

    本文主要介紹了Mybatis讀取和存儲json類型數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Java中的RocketMQ消費冪等詳解

    Java中的RocketMQ消費冪等詳解

    這篇文章主要介紹了Java中的RocketMQ消費冪等詳解,當出現(xiàn)消費者對某條消息重復消費的情況時,重復消費的結(jié)果與消費一次的結(jié)果是相同的,并且多次消費并未對業(yè)務系統(tǒng)業(yè)務產(chǎn)生任何負面影響,那么這個消費過程就是消息冪等,需要的朋友可以參考下
    2023-10-10
  • Java Object類詳解_動力節(jié)點Java學院整理

    Java Object類詳解_動力節(jié)點Java學院整理

    Java作為一個龐大的知識體系,涉及到的知識點繁多,本文將從Java中最基本的類java.lang.Object開始談起,對java object類相關知識感興趣的朋友一起學習吧
    2017-04-04
  • SpringBoot用JdbcTemplates操作Mysql實例代碼詳解

    SpringBoot用JdbcTemplates操作Mysql實例代碼詳解

    JdbcTemplate是Spring框架自帶的對JDBC操作的封裝,目的是提供統(tǒng)一的模板方法使對數(shù)據(jù)庫的操作更加方便、友好,效率也不錯,這篇文章主要介紹了SpringBoot用JdbcTemplates操作Mysql
    2022-10-10
  • Java中ArrayList和Vector的區(qū)別

    Java中ArrayList和Vector的區(qū)別

    本文主要介紹了Java中ArrayList和Vector的區(qū)別,包括線程安全性、性能、同步機制、擴容機制、遍歷方式等,具有一定的參考價值,感興趣的可以了解一下
    2024-11-11
  • Java中泛型的接口、通配符使用詳解

    Java中泛型的接口、通配符使用詳解

    這篇文章主要介紹了Java中泛型的接口、通配符使用詳解,編譯時的類型安全監(jiān)測機制,也可以把這個數(shù)據(jù)類型理解成是一種可以傳遞的參數(shù),需要的朋友可以參考下
    2023-08-08
  • 編寫調(diào)用新浪微博API的Java程序來發(fā)送微博

    編寫調(diào)用新浪微博API的Java程序來發(fā)送微博

    這篇文章主要介紹了編寫調(diào)用新浪微博API的Java程序來發(fā)送微博的方法,只是展示了一個基本的程序框架而非一個完整的圖形化軟件:)需要的朋友可以參考下
    2015-11-11
  • SpringBoot實現(xiàn)RabbitMQ監(jiān)聽消息的四種方式

    SpringBoot實現(xiàn)RabbitMQ監(jiān)聽消息的四種方式

    本文主要介紹了SpringBoot實現(xiàn)RabbitMQ監(jiān)聽消息的四種方式,包括@RabbitListener,MessageListener接口,MessageListenerAdapter適配器,@RabbitHandler這幾種,感興趣的可以了解一下
    2024-05-05
  • SpringBoot 配置提示功能(超詳細)

    SpringBoot 配置提示功能(超詳細)

    這篇文章主要介紹了SpringBoot 配置提示功能,本文給大家介紹的超詳細,通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • 構(gòu)建Maven多模塊項目的方法

    構(gòu)建Maven多模塊項目的方法

    這篇文章主要介紹了構(gòu)建Maven多模塊項目的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08

最新評論

黑河市| 桃园县| 游戏| 灌云县| 黄骅市| 德化县| 东丽区| 绵阳市| 瓦房店市| 江门市| 佛学| 石景山区| 航空| 托克托县| 涟源市| 安图县| 教育| 灵石县| 波密县| 大理市| 尼玛县| 汝阳县| 武安市| 化德县| 东阳市| 永寿县| 桃江县| 河南省| 永仁县| 永清县| 开封市| 浦城县| 宿松县| 绥芬河市| 灵川县| 乌兰浩特市| 双城市| 古田县| 资中县| 桂阳县| 扎兰屯市|