多例設計模式

了不起的蓋茨比。發表於2020-12-30

1.寫在前面

外包的歸屬感的真的沒有,博主還好是比較孤獨的,所以沒有多大的影響,今年大的行情真的是不怎麼樣,筆者打算在這家外包待個半年,然後決定開溜。先好好學習充電吧!今天講到就是多例模式。

2.多例模式

這種情況有沒有?有!大點聲,有沒有?有!是,確實有,就出現在明朝,那三國期間的算不算,不算,各自稱帝,各有各的地盤,國號不同。大家還記得那首詩《石灰吟》嗎?作者是誰?于謙,他是被誰殺死的?明英宗朱祁鎮 ,對,就是那個在土木堡之變中被瓦刺俘虜的皇帝,被俘虜後,他弟弟朱祁鈺當上了皇帝, 就是明景帝,估計當上皇帝后樂瘋了,忘記把老哥朱祁鎮削為太上皇了, 我Shit,在中國的歷史上就這個時期是有2個皇帝,你說這期間的大臣多鬱悶,兩個皇帝耶,兩個精神依附物件呀。

這個場景放在我們設計模式中就是叫有上限的多例模式(沒上限的多例模式太容易了,和你直接new一個物件沒啥差別,不討論)怎麼實現呢,看我出招,先看類圖:

在這裡插入圖片描述

2.1具體的程式碼

然後看程式,先把兩個皇帝定義出來:

package com.ys;

import java.util.ArrayList;
import java.util.Random;

/*
 * 中國的歷史上一般都是一個朝代一個皇帝,有兩個皇帝的話,必然要PK出一個皇帝出來。
 * 問題出來了:如果真在一個時間,中國出現了兩個皇帝怎麼辦?比如明朝土木堡之變後,
 * 明英宗被俘虜,明景帝即位,但是明景帝當上皇帝后樂瘋了,竟然忘記把他老哥明英宗削為太上皇,
 * 也就是在這一個多月的時間內,中國竟然有兩個皇帝!
 * */
@SuppressWarnings("all")
public class Emperor {
    private static int maxNumOfEmperor = 2; //最多隻能有兩個皇帝
    private static ArrayList<String> emperorInfoList = new ArrayList<>(maxNumOfEmperor);//皇帝叫什麼名字
    private static ArrayList<Emperor> emperorList = new ArrayList<>(maxNumOfEmperor);//裝皇帝的列表
    private static int countNumOfEmperor = 0;

    //先把2個皇帝產生出來
    static {
        //把所有的皇帝都產生出來
        for (int i = 0; i < maxNumOfEmperor; i++) {
            emperorList.add(new Emperor("皇" + (i + 1) + "帝"));
        }
    }

    //就這麼多皇帝了,不允許再推舉一個皇帝(new 一個皇帝)
    private Emperor() {
        //世俗和道德約束你,目的就是不讓你產生第二個皇帝
    }

    private Emperor(String info){
        emperorInfoList.add(info);
    }

    public static Emperor getInstance(){
        Random random = new Random();
        countNumOfEmperor = random.nextInt(maxNumOfEmperor); //隨機拉出一個皇帝,只要是個精神領袖就成
        return emperorList.get(countNumOfEmperor);
    }

    //皇帝叫什麼名字呀
    public static void emperorInfo(){
        System.out.println(emperorInfoList.get(countNumOfEmperor));
    }
}

那大臣是比較悲慘了,兩個皇帝呀,兩個老子呀,怎麼拜呀,不管了,只要是個皇帝就成:

package com.ys;

/*
 * 大臣們悲慘了,一個皇帝都伺候不過來了,現在還來了兩個個皇帝
 * TND,不管了,找到個皇帝,磕頭,請按就成了!
 * */

@SuppressWarnings("all")
public class Minister {

    public static void main(String[] args) {
        int ministerNum = 10; //10個大臣
        for (int i = 0; i < ministerNum; i++) {
            Emperor emperor = Emperor.getInstance();
            System.out.print("第" + (i + 1) + "個大臣參拜的是: ");
            emperor.emperorInfo();
        }
    }
}

那各位看官就可能會不屑了:有的大臣可是有骨氣,只拜一個真神,你怎麼處理?這個問題太簡單,懶的詳細回答你,getInstance(param)是不是就解決了這個問題?!自己思考,太 Easy 了。

3.寫在最後

本篇部落格主要介紹了多例設計模式,這兒的多例設計模式,主要不是通過new的來建立的,這兒是指定的建立指定的個數的物件。

相關文章