设计模式-享元模式

Posted lufei33180

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-享元模式相关的知识,希望对你有一定的参考价值。

一、享元模式理解

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

三、总结

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

以上是关于设计模式-享元模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式课程 设计模式精讲 13-1 享元模式coding

常用设计模式系列之——享元模式

11-享元(Flyweight)模式Ruby实现

23种设计模式之享元模式代码实例

深入理解设计模式-享元模式

深入理解设计模式-享元模式