《设计模式之禅》--单例扩展:多例模式

需求:一个类只能产生两三个对象

public class Emperor {
    //定义最多能产生的实例数量
    private static int maxNumOfEmperor = 2;
    //每个皇帝都有名字,使用一个ArrayList来容纳,每个对象的私有属性
    private static ArrayList<String> nameList = new ArrayList<String>();
    //定义一个列表,容纳所有的皇帝实例
    private static ArrayList<Emperor> emperorList = new ArrayList<Emperor>();
    //当前皇帝序列号
    private static int countNumOfEmperor = 0;

    //产生所有的对象
    static {
        for (int i = 0; i < maxNumOfEmperor; i++) {
            emperorList.add(new Emperor("皇" + (i + 1) + "帝"));
        }
    }

    private Emperor() {
        //世俗和道德约束你,目的就是不产生第二个皇帝
    }

    //传入皇帝名称,建立一个皇帝对象
    private Emperor(String name) {
        nameList.add(name);
    }

    //随机获得一个皇帝对象
    public static Emperor getInstance() {
        Random random = new Random();
        //随机拉出一个皇帝,只要是个精神领袖就成
        countNumOfEmperor = random.nextInt(maxNumOfEmperor);
        return emperorList.get(countNumOfEmperor);
    }

    //皇帝发话了
    public static void say() {
        System.out.println(nameList.get(countNumOfEmperor));
    }
}
public class Minister {
    public static void main(String[] args) {
        //定义5个大臣
        int ministerNum = 5;
        for (int i = 0; i < ministerNum; i++) {
            Emperor emperor = Emperor.getInstance();
            System.out.print("第" + (i + 1) + "个大臣参拜的是:");
            emperor.say();
        }
    }
}

运行结果如下

第1个大臣参拜的是:皇1帝
第2个大臣参拜的是:皇2帝
第3个大臣参拜的是:皇1帝
第4个大臣参拜的是:皇1帝
第5个大臣参拜的是:皇2帝

原文地址:https://www.cnblogs.com/anni-qianqian/p/8434744.html

时间: 2024-11-06 15:39:02

《设计模式之禅》--单例扩展:多例模式的相关文章

《设计模式之禅》--代理扩展:动态代理

接上篇<设计模式之禅>--代理扩展:强制代理 动态代理就是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象.相对来说,自己写代理类的方式就是静态代理 面向切面编程(AOP)核心就是采用了动态代理机制 public interface Subject { //业务操作 public void doSomething(String str); } public class RealSubject implements Subject { //业务操作 public void doSome

《设计模式之禅》--策略扩展:策略枚举

接上篇<设计模式之禅>--代理扩展:动态代理 需求:加减法计算 public enum Calculator { //加法运算 ADD("+") { public int exec(int a, int b) { return a + b; } }, //减法运算 SUB("-") { public int exec(int a, int b) { return a - b; } }; String value = ""; //定义成

《设计模式之禅》--备忘录扩展:clone方式的备忘录

接上篇<设计模式之禅>--策略扩展:策略枚举 需求:使用clone方式实现备忘录模式 发起人角色 public class Originator implements Cloneable { //内部状态 private String state = ""; public String getState() { return state; } public void setState(String state) { this.state = state; } //创建一个备

设计模式的征途—1.单例(Singleton)模式

单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛.创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展.每一个创建型模式都在视图回答3个问题:3W -> 创建什么(What).由谁创建(Who)和何时创建(When). 本篇是创建型模式的第一篇,也是最简单的一个设计模式,虽然简单,但是其使用频率确是很高的. 单例模式(Singleton) 学习难度:★☆☆☆☆ 使用频率:★★★★☆ 一.单例

Java设计模式中的单例设计

/** * 单例设计模式 * 应用场合:只需要一个对象的 * 作用:保证整个应用程序中某个实例有且只有一个 * 类型有:饿汉模式.懒汉模式 * 下面的例子是一个饿汉模式的例子 */ class SingleDemo { // 1.将构造方法私有化,不允许外部直接创建使用 private SingleDemo() {} // 2.创建类的唯一实例,使用private static修饰 private static SingleDemo instance = new SingleDemo(); //

详略。。设计模式2——单例变形(多例).。。。studying

★ 缓存在单例中的使用("单例+缓存"技术) 缓存在编程中使用非常频繁,有着非常关键的数据,它可以帮助程序实现以空间换取时间, 通常被设计成整个应用程序所共享的一个空间,现要求实现一个用缓存存放单例对象的类. 说明:该缓存中能够存放多个该类对象,每一个对象以一个key值标识.key值同样时所訪问的是同一个单例对象. ★ 单例变形--多例模式("单例+缓存+控制实例个数"技术) 把上面缓存的单例实现,做成一个可以控制对象个数的共享空间,供整个应用程序使用. 在缓存中维

Duilib初级控件扩展一例: 具有鼠标滚动消息的OptionUI

当初之所以有这个想法, 是因为我想在Option上滚动鼠标的时候自动切换到前一个(或后一个)Option上面去. 所有的OptionUI在水平布局HorizontalLayout上面. 例子虽然能达到我要的前后的效果, 但是后来证明我错了, 试想想看, 为什么是让OptionUI来处理鼠标滚动消息, 让一个OptionUI处理鼠标滚动消息有啥意义? 明明该交给Option所在的水平布局来处理, 不是最好的选择吗? 的确是这样, 我当时就应该多想法再写的, 也可能是熟能生巧的原因吧, 以后注意了.

Spring4 In [email&#160;protected]单例、多例Bean

Spring In [email protected]单例.多例Bean 代码下载地址:http://download.csdn.net/download/poiuy1991719/9967494 Singleton:单例    @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)@Scope("singleton") Prototype:每次注入都会创建新的   @Scope(ConfigurableBeanFactory.SCOPE_PRO

单例和多例的区别

单例和多例的区别 单例多例需要搞明白两个问题:1. 什么是单例多例:2. 如何产生单例多例:3. 为什么要用单例多例4. 什么时候用单例,什么时候用多例:1. 什么是单例.多例:所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action; 一.单例模式和多例模式说明: 1.         单例模式和多例模式属于对象模式. 2.         单例模式的对象在整个系统中只有一份,多例模式可以有多

Java 单例和多例详解

1. 什么是单例多例:所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action;  2. 如何产生单例多例:在通用的SSH中,单例在spring中是默认的,如果要产生多例,则在配置文件的bean中添加scope="prototype";  3. 为什么用单例多例:之所以用单例,是因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存:之所以用多例,是为了防止并发问题:即一个请求