1. 程式人生 > >設計模式之多例模式

設計模式之多例模式

多例模式:

類可以存在有限的多個例項物件。

多例模式的特點

  1. 通過容器儲存例項物件
  2. 利用私有構造器阻止外部建立物件
  3. 通過getInstance方法獲取例項物件

程式碼演示

建立兩個機器人物件:

package com.company.section5;

import java.util.HashMap;
import java.util.Random;

/**
 * 機器人
 * 
 * @author zhangdongping
 */
public class Droid {

    /**
     * 機器人容器,生產出來的機器人都放在這裡面
     */
    private static HashMap<String, Droid> droids = new HashMap<>();

    /**
     * 為機器人選了兩個名字,一個叫“阿爾法狗”,另一個叫“深藍”
     */
    public static final String[] names = {"阿爾法狗", "深藍" };

    /**
     * 機器人應該有自己名字
     */
    private String name;

    /**
     * 直接製造兩個機器人,放入機器人容器
     */
    static {
        // 第一個機器人是阿爾法狗
        Droid alphaGo = new Droid(names[0]);
        droids.put(names[0], alphaGo);

        // 第二個機器人是深藍
        Droid master = new Droid(names[1]);
        droids.put(names[1], master);
    }

    /**
     * 構造機器人的時候,應該取好名字<br/>
     * 私有建構函式,在外部無法進行構造
     * 
     * @param name
     */
    private Droid(String name) {
        this.name = name;
    }

    /**
     * 隨便抓一個機器人,無論是誰,是機器人就行。
     * 
     * @return
     */
    public static Droid getRandomInstance() {
        Random random = new Random();
        int index = random.nextInt(2);
        String name = names[index];
        return droids.get(name);
    }

    /**
     * 叫機器人的名字,找到和名字匹配的那個機器人
     * 
     * @param name
     * @return
     */
    public static Droid getInstance(String name) {
        return droids.get(name);
    }

    /**
     * 機器人有一個應答功能,會報告自己名字。
     */
    public void reply() {
        System.out.println("I am " + name + ", I'm here.");
    }
}

建立測試類

package com.company.section5;

/**
 * 對機器人進行點名
 * 
 * @author zhangdongping
 */
public class Call {

    public static void main(String[] args) {
        // 隨便抓機器人,抓6次,每抓一個機器人出來,就讓它報自己的名字
        for (int i = 0; i < 6; i++) {
            Droid droid = Droid.getRandomInstance();
            droid.reply();
        }

        System.out.println("");
        System.out.println("=====華麗麗的分隔符=====");
        System.out.println("");

        // 找到阿爾法狗,讓它報道
        Droid alphaGo = Droid.getInstance(Droid.names[0]);
        alphaGo.reply();

        // 找到深藍,讓它報道
        Droid master = Droid.getInstance(Droid.names[1]);
        master.reply();
    }
}