共享对象!
目的:
减少创建对象的数量,以减少内存占用和提高性能。
核心奥义:
通过享元类工厂来控制类的生成,相同的对象被放在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("猪猪")); }
测试结果:
标签:享元,String,Pet,模式,name,FlyWeight,public,享元类,Man From: https://www.cnblogs.com/lurenjia-bky/p/16926296.html