Singleton 和 Monostate 模式

怎样才能使得两个实例表现得像一个对象呢?很简单,只要把所有的变量都变成静态变量即可。

public class Monostate {private static int itsX = 0;public Monostate() {}public void setX(final int x) {itsX = x;}public int getX() {return itsX;}
}

实现地铁十字转门的简单的有限状态机。十字转门开始时处于Locked 状态。如果投入一枚硬币,它就迁移到Unlocked 状态,开启转门,复位可能出现的任何告警状态,并把硬币放到收集箱柜中。如果此时乘客通过了转门,转门就迁移回Locked 状态并把门锁上。

实现类

public class Turnstile {/*** 是否已锁.*/private static boolean isLocked = true;/*** 是否报警中.*/private static boolean isAlarming = false;/*** 硬币数.*/private static int itsCoins = 0;/*** 退款数.*/private static int itsRefunds = 0;protected static final Turnstile LOCKED = new Locked();protected static final Turnstile UNLOCKED = new Unlocked();protected static Turnstile itsState = LOCKED;public void reset() {lock(true);alarm(false);itsCoins = 0;itsRefunds = 0;itsState = LOCKED;}public boolean locked() {return isLocked;}public boolean alarm() {return isAlarming;}/*** 投币.*/public void coin() {itsState.coin();}/*** 通过.*/public void pass() {itsState.pass();}/*** 设置锁住.* @param shouldLock*/protected void lock(boolean shouldLock) {isLocked = shouldLock;}/*** 设置报警.* @param shouldAlarm*/protected void alarm(boolean shouldAlarm) {isAlarming = shouldAlarm;}/*** 获取投币数.* @return*/public int coins() {return itsCoins;}/*** 获取退款数.* @return*/public int refunds() {return itsRefunds;}/*** 存钱.*/public void deposit() {itsCoins++;}/*** 退款.*/public void refund() {itsRefunds++;}static class Locked extends Turnstile {public void coin() {Turnstile.itsState = UNLOCKED;lock(false);alarm(false);deposit();}public void pass() {alarm(true);}}static class Unlocked extends Turnstile {public void coin() {refund();}public void pass() {lock(true);itsState = LOCKED;}}
}

测试类

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;public class TurnstileTest {@Beforepublic void before() {// 每次@Test前执行.Turnstile t = new Turnstile();t.reset();}@Testpublic void whenInit() {Turnstile t = new Turnstile();Assert.assertTrue(t.locked());}@Testpublic void whenCoin() {Turnstile t = new Turnstile();t.coin();Turnstile t1 = new Turnstile();Assert.assertTrue(!t1.locked());Assert.assertEquals(1, t1.coins());}@Testpublic void whenCoinAndPass() {Turnstile t = new Turnstile();t.coin();t.pass();Turnstile t1 = new Turnstile();Assert.assertTrue(t1.locked());Assert.assertTrue(!t1.alarm());Assert.assertEquals(1, t1.coins());}@Testpublic void whenTowCoins() {Turnstile t = new Turnstile();t.coin();t.coin();Turnstile t1 = new Turnstile();Assert.assertTrue(!t1.locked());Assert.assertEquals(1, t1.coins());Assert.assertEquals(1, t1.refunds());Assert.assertTrue(!t1.alarm());}@Testpublic void whenPass() {Turnstile t = new Turnstile();t.pass();Turnstile t1 = new Turnstile();Assert.assertTrue(t1.alarm());Assert.assertTrue(t1.locked());}@Testpublic void whenCancelAlarm() {Turnstile t = new Turnstile();t.pass();t.coin();Turnstile t1 = new Turnstile();Assert.assertTrue(!t1.alarm());Assert.assertTrue(!t1.locked());Assert.assertEquals(1, t1.coins());Assert.assertEquals(0, t1.refunds());}@Testpublic void whenTwoOperations() {Turnstile t = new Turnstile();t.coin();t.pass();t.coin();Assert.assertTrue(!t.locked());Assert.assertEquals(2, t.coins());t.pass();Assert.assertTrue(t.locked());}
}

Singleton 和 Monostate 模式相关推荐

  1. Singleton 与 MonoState 模式

      1. Singleton 模式的不同实现形式 1) 最简单的Sigleton (无线程同步, 不适应多线程环境) using System; public class Singleton { pr ...

  2. Monostate模式

    请注意这两个模式的区别,在于一个关注行为,而另一个关注结构.Singleton模式强调结构上的单一性.它防止创建多个对象实例.相反,Monostate模式则强制行为上的单一性,而没有加强结构方面的限制 ...

  3. javascript设计模式-singleton(单例)模式

    singleton(单例)模式被熟知的原因是因为它限制了类的实例化次数只能一次,单例模式,在该实例不存在的勤快下,可以通过一个方法创建一个类来实现创建类的新实例:如果实例已经存在,则会简单返回该对象的 ...

  4. 设计模式学习之--Singleton(单例)模式

    1.Singleton单例模式,是一种责任型模式.这种模式,通过隐藏构造器和提供对创建对象的单个访问点,实现了将类的职责---创建一个担当着独一无二角色的对象(生产唯一实例),集中于类的单个实例中. ...

  5. C#面向对象设计模式第二讲:Singleton Pattern单件模式(创建型模式)

    (根据MSDN Webcast相关课程整理) 模式分类: 从目的来看: 创建型(Creational):负责对象的创建 结构型(Structural):处理类与对象间的组合 行为型(Behaviora ...

  6. Visual Basic了解

    Visual Basic是一种由微软公司开发的结构化的.模块化的.面向对象的.包含协助开发环境的事件驱动为机制的可视化程序设计语言.这是一种可用于微软自家产品开发的语言.它源自于Basic编程语言.V ...

  7. Visual Basic编程语言

    1991年,美国微软公司推出了Visual Basic 1.0(可简称VB),1992年,Microsoft公司又推出 V<wbr></wbr>B<wbr>< ...

  8. Visual Basic 历史版本大回顾

    Visual Basic从1991年诞生以来,现在已经13年了.BASIC是微软的起家产品,微软当然不忘了这位功臣.随着每一次微软技术的浪潮,Visual Basic都会随之获得新生.可以预见,将来无 ...

  9. The Singleton of Design Pattern单态模式

    1 Singleton Definition 单态模式定义        The main purpose is to gurantee that the instance of class has ...

最新文章

  1. JVM 常见异常及内存诊断
  2. [4.9福建四校联考]
  3. 02dayC语言数据类型
  4. AL2018届校招笔试——自然语言处理
  5. ORACLE表空间的相关操作
  6. 单调栈之Next Greater Number
  7. linux服务器指示灯,【转】明明白白你的Linux服务器——故障篇 | 旺旺知识库
  8. show部分书...
  9. 查看宝塔面板账号密码命令_宝塔面板升级到最新版图文教程
  10. FYR的完整形式是什么?
  11. 互联网金融盯上房地产资金饥渴症
  12. SAP编辑器ABAP代码添加模板
  13. console_init初始化的研究
  14. 【图像隐写】基于matlab GUI DCT数字水印嵌入置乱攻击提取【含Matlab源码 1669期】
  15. 华为(H3C)visio图库,是完全版的包括PPT格式与VISIO格式
  16. 【驱动】DM9000网卡驱动分析
  17. 0806 07 08 09 12上午数据库
  18. GRE Over IPSec技术
  19. 2019河南对口升学高考试卷计算机专业课,2019河南对口升学高考试卷计算机专业课-9页word资料...
  20. 传腾讯计划出售美团全部股权,知情人士辟谣;苹果证实iOS 16要大量推送广告;Linux 6.0-rc1 发布|极客头条

热门文章

  1. transformer xl在文本生成上面的应用
  2. 一张图带你了解JRE、JDK、JVM
  3. 如何让css与js分离
  4. mysql 字段唯一性问题
  5. Java基础11-封装(思想、访问权限、this、构造方法)
  6. ThinkingInJava对this关键字的介绍
  7. jmeter性能指标
  8. C/C++ scanf 函数中%s 和%c 的简单差别
  9. 问题解决:使用angularjs、ionic框架如何实现返回上一页并刷新
  10. sql 系统函数取表基本信息