首页 > 其他分享 >设计模式—结构型模式之享元模式

设计模式—结构型模式之享元模式

时间:2023-11-20 20:22:26浏览次数:32  
标签:享元 MyComputer 电脑 模式 public 使用 设计模式 id

设计模式—结构型模式之享元模式

享元模式(Flyweight Pattern),运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。对象结构型。
在享元模式中可以共享的相同内容称为内部状态(IntrinsicState),而那些需要外部环境来设置的不能共享的内容称为外部状态(Extrinsic State),由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以具有一些不同的特征,而相同的内部状态是可以共享的。
在享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池(Flyweight Pool)用于存储具有相同内部状态的享元对象。

享元模式可以理解为池化技术。

享元模式包含如下角色:

  • Flyweight: 抽象享元类 Connection
  • ConcreteFlyweight: 具体享元类 ConnectionImpl(user,pwd,url)
  • UnsharedConcreteFlyweight: 非共享具体享元类ConnectionImpl(state)
  • FlyweightFactory: 享元工厂类;可以写一个简单工厂,因为产品就一个Connection。

例子

比如一个网吧中有很多电脑,每个电脑都可以被人使用,但是当有人在使用这个电脑,就不能被其他人使用了。这便是享元模式的实例。

/**
 * 抽象电脑类
 */
public abstract class AbstarctComputer {
    //是否能被使用
    boolean canUse = true;

    //使用电脑
    abstract void useComputer();

    //使用完成
    abstract void useComputerCompletion();


    public boolean isCanUse(){
        return canUse;
    }
}

实际的电脑类如下:

public class MyComputer extends AbstarctComputer{
    //电脑编号
    private String id;

    public MyComputer(String id) {
        this.id = id;
    }

    /**
     * 使用电脑
     */
    @Override
    void useComputer() {
        System.out.println(this.id + "号电脑使用中");
        //设置其他人不能使用
        this.canUse = false;
    }

    @Override
    void useComputerCompletion() {
        System.out.println(this.id + "号电脑使用完成");
        //设置其他人可以使用
        this.canUse = true;
    }
    public String getId() {
        return id;
    }
}

网吧类如下:

public class MyInternetCafe {

    //电脑集合--》池子
    private static Map<String,MyComputer> computerPool = new HashMap<>();

    static {
        MyComputer myComputer1 = new MyComputer("111");
        MyComputer myComputer2 = new MyComputer("222");
        computerPool.put(myComputer1.getId(),myComputer1);
        computerPool.put(myComputer2.getId(),myComputer2);
    }


    /**
     * 通过id返回能够使用的电脑,如果找不到,返回一个可以使用的
     * @param id
     * @return
     */
    public static AbstarctComputer getComputer(String id){
        MyComputer computer = computerPool.get(id);

        
        if(computer == null || !computer.isCanUse()) {
            //如果没有这个id 或者 不能被使用,找一个可以使用的
            for (MyComputer myComputer : computerPool.values()) {
                if(myComputer.isCanUse()){
                    System.out.println("您要使用的"+id+"号电脑正在被使用或者无此电脑,为您找到一台电脑id为:"+myComputer.getId());
                    return myComputer;
                }
            }
            
            //都在使用返回空
            return null;
        }
        
        return computer;

    }
}

测试类如下:

public class Test {
    public static void main(String[] args) {
        AbstarctComputer computer = MyInternetCafe.getComputer("111");

        computer.useComputer();

        AbstarctComputer computer1 = MyInternetCafe.getComputer("111");
        computer1.useComputer();

        computer.useComputerCompletion();

        AbstarctComputer computer2 = MyInternetCafe.getComputer("111");
        computer2.useComputer();

    }
}

运行截图如下:

运行截图

标签:享元,MyComputer,电脑,模式,public,使用,设计模式,id
From: https://www.cnblogs.com/nicaicai/p/17844765.html

相关文章

  • JavaSE面试题02:单例设计模式
    单例模式来源:https://www.runwsh.com/archives/biitngg1f7s00001.什么事Singleton?Singleton:在Java中即指单例设置模式,探视软件开发最常用的设置模式之一通俗解释:单例模式单:唯一例:实例单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式......
  • 学习随笔(设计模式:建造者模式)
    内容今天学习了建造者模式。1.建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。2.简单来说就是一个类的所有的特性方法与这个类对象的构建分离3.本来觉得有点类似于工厂模式,但细想又不太一样。工厂模式是创建一个类,这个类用来创新用户......
  • 设计模式-享元模式
    参考:https://blog.csdn.net/shuai_h/article/details/129701459概述-运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。优缺点优点极大减少内存中相似或相同对象......
  • 虚拟机桥接模式(网络渗透测试2)
    题目:1、Kali虚拟机采用桥接模式;物理机连接Guet-WiFi,Kali中查看网络配置并截图,能获得IP地址吗?2、Kali虚拟机采用桥接模式;物理机连接手机热点,Kali中查看网络配置并截图,能获得IP地址吗?3、对于1、2的结果,进行总结分析。首先我们需要知道桥接模式,桥接模式即将主机网卡与虚拟机的网卡......
  • 抽象工厂模式
    [实验任务一]:人与肤色使用抽象工厂模式,完成下述产品等级结构:画出对应的类图;提交源代码;Black.javapackagePeopleAndSkinColor;publicclassBlackimplementsColor{@OverridepublicManproduceMan(){returnnewBlackMan();}@Override......
  • 组合模式
    目录组合模式概述结构案例实现组合模式的分类优点使用场景组合模式概述​ 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相......
  • 为什么说SaaS模式的CRM系统是更好的选择?
     在以前,CRM系统只有本地部署一个选择。但近年来,SaaS模式CRM逐渐火热。SaaS模式CRM系统联网即可访问,不需要用户在自己的服务器上安装和运行,通过订阅的方式即可获得服务。下面说说,选择SaaS模式CRM系统的理由。1、费用更低使用SaaS模式CRM系统,只需要支付账号费用,就可以通过浏览......
  • SpringBoot 策略模式 切换上传文件模式
    策略模式策略模式是指有一定行动内容的相对稳定的策略名称。我们定义一个接口(就比如接下来要实现的文件上传接口)我们定义所需要实现的策略实现类A、B、C、D(也就是项目中所使用的四种策略阿里云Oss上传、腾讯云Cos上传、七牛云Kodo上传、本地上传)我们通过策略上下文来调用策......
  • 学习随笔(设计模式:外观模式)
    内容今天学习了外观模式。1.外观模式,为子系统中的一组接口提供了一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。2.起始很多现在的软件思路都是遵从于外观模式,它完美的依赖倒转原则和迪米特法则的思想。3.软件编程采用三层架构,数据访问层、业务......
  • 命令模式
    实验16:命令模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解命令模式的动机,掌握该模式的结构;2、能够利用命令模式解决实际问题。 [实验任务一]:多次撤销和重复的命令模式某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对......