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

java設(shè)計(jì)模式之建造者模式學(xué)習(xí)

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

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

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

 蘋果:

 

復(fù)制代碼 代碼如下:

 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");
        }
    }
}
 

 三星:

 

復(fù)制代碼 代碼如下:

 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");
        }
    }
}
 

測(cè)試客戶端:

復(fù)制代碼 代碼如下:

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)個(gè)問題?那就是生產(chǎn)手機(jī)的每一道工序都是一樣的,確切的說是工序名稱一樣,只是具體的每個(gè)工序的處理不同,工序是不變的,就這么幾步,每道工序的具體處理是變化的,由此,我們可以把不變的抽取出來,以“不變應(yīng)萬變”,將變化的,交給具體的產(chǎn)品來做。
具體怎么做?這回的Builder模式派上用場(chǎng)了。

首先來個(gè)Phone的接口:

復(fù)制代碼 代碼如下:

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");
        }
    }
}

蘋果手機(jī)類:

復(fù)制代碼 代碼如下:

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

}

三星手機(jī)類:

復(fù)制代碼 代碼如下:

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

}

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

復(fù)制代碼 代碼如下:

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();
}

蘋果手機(jī)的Builder:

復(fù)制代碼 代碼如下:

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;
    }

}

三星手機(jī)的Builder:

復(fù)制代碼 代碼如下:

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;
    }

}

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

復(fù)制代碼 代碼如下:

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();
    }
}

最后寫個(gè)測(cè)試類:

復(fù)制代碼 代碼如下:

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();
    }

}

運(yùn)行結(jié)果:

復(fù)制代碼 代碼如下:

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

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

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

相關(guān)文章

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

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

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

    Java中的RocketMQ消費(fèi)冪等詳解

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

    Java Object類詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java作為一個(gè)龐大的知識(shí)體系,涉及到的知識(shí)點(diǎn)繁多,本文將從Java中最基本的類java.lang.Object開始談起,對(duì)java object類相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2017-04-04
  • SpringBoot用JdbcTemplates操作Mysql實(shí)例代碼詳解

    SpringBoot用JdbcTemplates操作Mysql實(shí)例代碼詳解

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

泽普县| 沁源县| 香港| 沅江市| 龙里县| 温州市| 望都县| 马山县| 麟游县| 沭阳县| 翁源县| 绥芬河市| 太保市| 夏津县| 凤城市| 琼结县| 郧西县| 荃湾区| 铁力市| 桐梓县| 镇赉县| 万载县| 临桂县| 井研县| 股票| 饶阳县| 阿拉善盟| 高州市| 张掖市| 苗栗市| 玛曲县| 横山县| 高陵县| 会宁县| 东乡族自治县| 鸡东县| 新干县| 大石桥市| 图们市| 滦南县| 绥化市|