码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式-享元模式

时间:2020-07-26 15:01:31      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:常量   ide   使用   div   private   数据   外部   客户   str   

一、享元模式理解

享元言外之意就是共享,共享就是一样不变的部分能够得到重用,公用,享元模式则是对对象的共享,有点类似于单例模式的懒汉模式,降低系统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常量池、缓冲池

三、总结

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

设计模式-享元模式

标签:常量   ide   使用   div   private   数据   外部   客户   str   

原文地址:https://www.cnblogs.com/lufei33180/p/13379486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!