設計模式之多例模式
阿新 • • 發佈:2018-12-11
多例模式:
類可以存在有限的多個例項物件。
多例模式的特點
- 通過容器儲存例項物件
- 利用私有構造器阻止外部建立物件
- 通過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(); } }