亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java設(shè)計模式之建造者模式學習

 更新時間: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類是有關(guān)系的兩個類,它們不同的手機品牌,如果遇到兩個或多個沒有太多關(guān)系的類,公共的接口Phone就沒有存在的必要,但是這時候,那么 Builder 接口的規(guī)定的 getPhone() 方法的返回值怎么確定呢?

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

相關(guān)文章

  • JAVA簡單實現(xiàn)MD5注冊登錄加密實例代碼

    JAVA簡單實現(xiàn)MD5注冊登錄加密實例代碼

    本篇文章主要介紹了JAVA簡單實現(xiàn)MD5注冊登錄加密實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 二叉樹基本操作之遞歸和非遞歸遍歷、分支節(jié)點數(shù)詳解

    二叉樹基本操作之遞歸和非遞歸遍歷、分支節(jié)點數(shù)詳解

    這篇文章主要介紹了二叉樹基本操作之遞歸和非遞歸遍歷、分支節(jié)點數(shù)詳解,二叉樹是由n(n>=0)個結(jié)點的有限集合構(gòu)成,此集合或者為空集,或者由一個根結(jié)點及兩棵互不相交的左右子樹組成,并且左右子樹都是二叉樹,需要的朋友可以參考下
    2023-09-09
  • Java集合Stream流操作的基本使用教程分享

    Java集合Stream流操作的基本使用教程分享

    流操作并不會影響原來的集合,可以簡單認為,流操作是把集合中的一個元素逐個復制放到一個首尾相接的流動的水槽中。這篇文章整理了Stream流操作的基本使用,需要的可以參考一下
    2023-02-02
  • Windows環(huán)境下重啟jar服務bat代碼的解決方案

    Windows環(huán)境下重啟jar服務bat代碼的解決方案

    在Windows環(huán)境下部署java的jar包,若有多個服務同時啟動,很難找到相應服務重啟,每次都重啟全部服務很麻煩,應用場景大多用于部署測試,今天給大家分享Windows環(huán)境下重啟jar服務bat代碼,感興趣的朋友一起看看吧
    2023-08-08
  • Java 添加、更新和移除PDF超鏈接的實現(xiàn)方法

    Java 添加、更新和移除PDF超鏈接的實現(xiàn)方法

    PDF超鏈接用一個簡單的鏈接包含了大量的信息,滿足了人們在不占用太多空間的情況下渲染外部信息的需求。這篇文章主要介紹了Java 添加、更新和移除PDF超鏈接的實現(xiàn)方法,需要的朋友可以參考下
    2019-05-05
  • Java操作Excel的示例詳解

    Java操作Excel的示例詳解

    在平時可以使用IO流對Excle進行操作,但是現(xiàn)在使用更加方便的第三方組件來實現(xiàn)。本文就來和大家聊聊Java如何通過第三方組件實現(xiàn)操作Excel,需要的可以參考一下
    2023-01-01
  • 淺談HTTP使用BASIC認證的原理及實現(xiàn)方法

    淺談HTTP使用BASIC認證的原理及實現(xiàn)方法

    下面小編就為大家?guī)硪黄獪\談HTTP使用BASIC認證的原理及實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Struts2學習教程之入門小白的開始基礎(chǔ)

    Struts2學習教程之入門小白的開始基礎(chǔ)

    struts2其實就是為我們封裝了servlet,簡化了jsp跳轉(zhuǎn)的復雜操作,并且提供了易于編寫的標簽,可以快速開發(fā)view層的代碼。下面這篇文章主要給各位想要學習Struts2的小白們詳細介紹了關(guān)于Struts2入門的一些開始基礎(chǔ),需要的朋友可以參考下
    2018-04-04
  • SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時丟失精度問題

    SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時丟失精度問題

    這篇文章主要介紹了SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時丟失精度問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • jvm crash的崩潰日志詳細分析及注意點

    jvm crash的崩潰日志詳細分析及注意點

    本篇文章主要介紹了jvm crash的崩潰日志詳細分析及注意點。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-04-04

最新評論