单态模式【其他模式】

单态模式

public class MonoState {
    /**
     * MonoState pattern【单态模式】
     * all instances of the class will have the same state
     * 此类的所有实例都具有相同的状态,可以作为单例模式的替代者。
     * Enforces a behavior like sharing the same state amongst all instances.
     * 强制在所有实例中执行共享相同状态的行为。
     */
    @Test
    public void all() {
        final LoadBalancer lb1 = new LoadBalancer();
        final LoadBalancer lb2 = new LoadBalancer();
        lb1.service(StringRequest.of("hello"));
        lb2.service(StringRequest.of("world"));
    }
}

interface Request<T> {
    T body();
}
interface Server<T> {
    void service(Request<T> request);
}
@Value(staticConstructor = "of")
class StringRequest implements Request<String> {
    private final String body;
    @Override
    public String body() {
        return body;
    }
}
@Value(staticConstructor = "of")
@Slf4j
class StringServer implements Server<String> {
    private String host;
    private int port;
    @Override
    public void service(Request<String> request) {
        log.info("{} handle request {}", toString(), request.body());
    }
}

class LoadBalancer {
    private static final List<Server<String>> servers = Lists.newArrayList();
    private static int lastServerId;

    static {
        servers.add(StringServer.of("localhost", 1));
        servers.add(StringServer.of("localhost", 2));
        servers.add(StringServer.of("localhost", 3));
    }

    public void service(Request<String> request) {
        Optional.ofNullable(getServer()).ifPresent(server -> server.service(request));
    }

    private Server<String> getServer() {
        if (++lastServerId >= servers.size()) {
            lastServerId = 0;
        }
        return servers.get(lastServerId);
    }
}

原文地址:https://www.cnblogs.com/zhuxudong/p/10223978.html

时间: 2024-10-11 18:45:32

单态模式【其他模式】的相关文章

Java设计模式(十) 备忘录模式 状态模式

(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(String value){ this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } class Storage

专用服务器模式&amp;共享服务器模式

连接ORACLE服务器一般有两种方式:专用服务器连接(dedicated server)和共享服务器连接(shared server).那么两者有啥区别和不同呢?下面我们将对这两者的区别与不同一一剖析. 专用服务器模式(dedicated server)模式 在专用服务器模式中,用户进程运行在客户端的机器上,专用服务器进程运行在数据库服务器,用户进程和专用服务器进程是两种不同类型的进程. 对于专用服务器模式,在用户登录时,ORACLE总会创建一个新的服务进程,这通常称为专用服务器配置.这个服务器

Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解. [size=1.8em]Handler+Runnable模式 我们先看一个并不是异步线程加载的例子,使用 Handler+Runnable模式. 这里为何不是新开线程的原因请参看这篇文章:Android Runnable 运行在那个线程 这里的代码其实是在UI 主线程中下载图片的,而不是新开线程. 我们运行下面代码时,会发现他其实是阻塞了整个界面

Java设计模式(五)外观模式 桥梁模式

(九)外观模式 外观模式为子系统提供一个接口,便于使用.解决了类与类之间关系的,外观模式将类之间的关系放在一个 Facade 类中,降低了类类之间的耦合度,该模式不涉及接口. class CPU { public void startup(){ System.out.println("cpu start"); } public void shutdown(){ System.out.println("cpu stop"); } } class Memory { pu

CentOS 7 单用户模式+救援模式

CentOS 7 单用户模式+救援模式.有时候大家可能会忘记自己的root密码,或者错误(命令输入错误,命令位置输入有误等)编辑了一个/etc目录下的核心文件导致系统不能正常启动了!怎么办?重新安装系统那是实在没有办法之举!那我们就进入如下两种方式把错误的配置文件改过来,重启系统不就好了吗!接下来咱们就学习一下两种模式恢复系统Lunix单用户模式+救援模式 单用户模式+救援模式类似windows的安全模式 使用虚拟机在系统里面输入指令重启系统是不能达到我们的要求的,也就是说IDC机房可不是想进就

设计模式-行为型模式-策略模式

策略模式 在实际工作中我用到了策略模式,但为什么要有环境角色呢? 这里我贴上英文对含义的介绍, The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. 然后看看这种设计模式的组成, 一般的,策略模式

命令模式 &amp; 策略模式 &amp; 模板方法

一.策略模式 策略模式:封装易变化的算法,可互相替换. GoF<设计模式>中说道:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换.该模式使得算法可独立于它们的客户变化. 比如:一个推送服务类,推送的方式,可以分为:QQ推送.邮箱推送.App推送.PC插件推送. 这里讲两个点: 1.推送方式可以互相替换: 2.这些推送方式只是单纯的属于推送服务这个类本身. 好好琢磨关键词:相互替换 二.命令模式 命令模式:解决“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题. GoF&l

delphi 11 编辑模式 浏览模式

编辑模式 浏览模式 设置焦点 //在使用前需要Webbrowser已经浏览过一个网页 否则错误 uses MSHTML; ///获取Webbrowser编辑模式里面的内容 procedure EditMode();begin  (Form1.WebBrowser1.Document as IHTMLDocument2).designMode := 'on';end;//----------------------------------------------------------------

管道和过滤器模式----POSA模式助记格式

名称:管道和过滤器(Pipes and Filters) 问题: 处理数据流 1.步骤可替换 2.步骤比组件更易于重用 3.不相连的步骤不共享信息 4.存在不同的输入数据源 5.可以以多种方式给出或存放输出结果 6.中间结果需要落地,以确保处理的正确性 7.暂不取消多重步骤(并发) 方案: 管道和过滤器模式----POSA模式助记格式,布布扣,bubuko.com

Atitit.mysql oracle with as模式临时表模式 CTE 语句的使用,减少子查询的结构性 mssql sql server..

Atitit.mysql  oracle with as模式临时表模式 CTE 语句的使用,减少子查询的结构性 mssql sql server.. 1. with ... as (...) 在mysql中应该如何表示 1 2. 子查询和查询嵌套主要是便于可读性提升上, 2 3. MYSQL中的解决之道::临时表. 2 4. Seo黑头关键字替换链接的统计样品 2 4.1. //---------查询com网站的数量 2 4.2. //----------------------查询net网站的