ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式-享元模式

2020-07-26 10:33:51  阅读:196  来源: 互联网

标签:享元 engine name molde Car 模式 设计模式 public String


一、享元模式理解

享元言外之意就是共享,共享就是一样不变的部分能够得到重用,公用,享元模式则是对对象的共享,有点类似于单例模式的懒汉模式,降低系统cpu,内存的消耗,不同于单例模式的是,享元模式分为内部状态和外部状态,内部状态就好比单例模式,不会改变,而外部方式是随着需求而改变的,比如汽车某一个型号的发动机不会变动,变动的是他要装载在哪一类车上,或者说棋子,不变的是黑色和白色,变的是他的位置坐标。

二、代码实现

public class Engine {
    private String name;
    private String molde;

    public Engine(String name, String molde) {
        System.out.println("开始造发动机:"+name);
        this.name = name;
        this.molde = molde;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMolde() {
        return molde;
    }

    public void setMolde(String molde) {
        this.molde = molde;
    }

    @Override
    public String toString() {
        return "Engine{" +
                "name='" + name + '\'' +
                ", molde='" + molde + '\'' +
                '}';
    }
}

//工厂类
public class EngineFactory {
    Map<String,Engine> engineMap=new HashMap<String,Engine>();
    public Engine getEngine(String name,String molde){
        if(null!=engineMap.get(name)){
            return engineMap.get(name);
        }
        Engine engine=new Engine(name,molde);
        engineMap.put(name,engine);
        return engine;
    }
}
//外部变化部分
public class Car {
    private String type;
    private Engine engine;


    public Car(String type, Engine engine) {
        this.type = type;
        this.engine = engine;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Engine getEngine() {
        return engine;
    }

    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    @Override
    public String toString() {
        return "Car{" +
                "type='" + type + '\'' +
                ", engine=" + engine +
                '}';
    }
}
//测试类
public class Test {
    public static void main(String[] args) {
        EngineFactory engineFactory=new EngineFactory();
        Car car1=new Car("高级car",engineFactory.getEngine("高级发动机","001"));
        Car car2=new Car("高级car",engineFactory.getEngine("高级发动机","001"));

        Car car3=new Car("低级car",engineFactory.getEngine("一般发动机","001"));
        Car car4=new Car("低级car",engineFactory.getEngine("一般发动机","001"));

        System.out.println(car1+"/r"+car2+"/r"+car3+"/r"+car4);

    }
}

三、使用场景

1.系统中需要生成大量的相似对象

2、需要用到池的场景,如数据库连接池、String常量池、缓冲池

三、总结

享元模式好比是工程模式+单例模式实现,客户端传递不同参数到工厂,工厂生产不同的产品,产品按照类型生产,不同类型共用一个对象,说到共享就会联想到线程安全,在对象的生成一定要加同步关键字+双重判断

标签:享元,engine,name,molde,Car,模式,设计模式,public,String
来源: https://www.cnblogs.com/lufei33180/p/13379486.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有