享元模式(FlyWeight )

共享对象!

目的:

  减少创建对象的数量,以减少内存占用和提高性能。

核心奥义:

  通过享元类工厂来控制类的生成,相同的对象被放在Map中。

享元对象的结构:

  内部状态:可以共享。一般为不可变的属性。

  外部状态:不可以共享。一般为可变的属性。


 

例子

享元类接口:包含了享元类要实现的方法。

interface InMan{
    String getName();
    void lookPet(Pet pet);
}

享元类:外部状态不影响它。

class Man implements InMan{
    private String name;//内部状态

    //构造器获得属性
    public Man(String name) { this.name = name; }

    @Override
    public String getName() { return name; }

    //外部状态,为可变化的类
    @Override
    public void lookPet(Pet pet) {
        System.out.println(name+"的宠物是:"+pet.getName());
    }
}

外部状态:一个宠物。

class Pet{
    private String name;
public Pet(String name) { this.name = name; }
public String getName() { return name;} }

享元类工厂:控制对象的产生。

class ManFactory{
    //享元池
    private static Map<String,InMan> map = new HashMap<>();

    //获取一个享元对象
    public static InMan getManInstance(String name){
        if(map.get(name)!=null){//池里有,直接拿去用
            return map.get(name);
        }else {//池里没有,新建一个
            InMan man = new Man(name);
            map.put(name,man);
            return man;
        }
    }
}

测试程序:

public static void main(String[] args) {
        Man man1= (Man) ManFactory.getManInstance("小五");
        Man man2= (Man) ManFactory.getManInstance("小五");
        Man man3= (Man) ManFactory.getManInstance("三号");
        System.out.println("man1对象地址:"+man1.hashCode());
        System.out.println("man2对象地址:"+man2.hashCode());
        System.out.println("man3对象地址:"+man3.hashCode());
        man1.lookPet(new Pet("狗狗"));
        man2.lookPet(new Pet("猪猪"));
    }

测试结果:

 

posted @ 2022-11-25 20:31  在博客做笔记的路人甲  阅读(60)  评论(0编辑  收藏  举报