Skip to content

Latest commit

 

History

History
88 lines (75 loc) · 2.29 KB

FlyWeight.md

File metadata and controls

88 lines (75 loc) · 2.29 KB

介绍

  • 属于结构型设计模式
  • 优点:外部状态(不可共享)相对独立,使得对象可以适应不同的外部环境,可共享相同的对象,减少内存消耗
  • 缺点:外部状态由客户端保存,要求内外部状态分离,使得程序的逻辑复杂化
  • 与单例模式区别是,系统中存在多个相同的对象,�共享一个对象的拷贝,可看作单例模式的扩展
  • 享元模式应用在数据库连接池

抽象角色

public interface Person {

    void introduce(String info);
}

具体角色

public class PersonImpl implements Person {

    private String name;

    public PersonImpl(String name) {
        this.name = name;
    }

    @Override
    public void introduce(String info) {
        System.out.println("inner parameter:" + this.name);
        System.out.println("outer parameter:" + info);
    }
}

享元工厂

public class FlyWeightFactory {

    private Map<String, Person> map = new HashMap<>();

    // 获取指定对象
    public Person getPerson(String name) {
        Person person = map.get(name);
        if (person == null) {
            person = new PersonImpl(name);
            map.put(name, person);
        }
        return person;
    }

    // 获取当前对象数量
    public int getCount() {
        return map.size();
    }
}

客户端

public class Main {

    public static void main(String[] args) {
        FlyWeightFactory factory = new FlyWeightFactory();
        Person person = factory.getPerson("stalary");
        person.introduce("第一次获取");
        person = factory.getPerson("hawk");
        person.introduce("第二次获取");
        person = factory.getPerson("stalary");
        person.introduce("第三次获取");
        System.out.println("当前对象数量:" + factory.getCount());
    }
}
// 测试结果
inner parameter:stalary
outer parameter:第一次获取
inner parameter:hawk
outer parameter:第二次获取
inner parameter:stalary
outer parameter:第三次获取
当前对象数量:2