一、基本概念
1、享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式。
2、角色
A:享元工厂:用于创建具体享元类,维护相同的享元对象。当请求对象已经存在时,直接返回对象,不存在时,在创建对象。
B:抽象享元:定义需要共享的对象业务接口。享元类被创建出来总是为了实现某些特定的业务逻辑.
C:具体享元:实现抽象享元类的接口,完成某一具体逻辑。
D:Client:客户端
二、简单例子
A:享元工厂:
1 package comm.pattern.struct.flyweight; 2 3 import java.util.HashMap; 4 5 /** 6 * 7 * @Title: BanknoteFactory.java 8 * @Package: comm.pattern.struct.flyweight 9 * @Description: 中央银行 10 * @author yangzhancheng 11 * @2020年3月19日:下午7:32:02 12 * 13 */ 14 public class BanknoteFactory { 15 16 private HashMap<String,IBanknote> banknoteMap = new HashMap<String,IBanknote>(); 17 18 private IBanknote Banknote; 19 20 /** 21 * 22 * @param face 23 * @return 24 */ 25 public IBanknote builder(String face){ 26 if(null == banknoteMap.get(face)){ 27 Banknote = new Banknote(face); 28 banknoteMap.put(face, Banknote); 29 System.out.println("没有这个模版,创建模版:"+face); 30 }else{ 31 Banknote = banknoteMap.get(face); 32 System.out.println("这个模版存在,创建模版:"+face); 33 } 34 35 return Banknote; 36 } 37 }
B:抽象享元:
1 package comm.pattern.struct.flyweight; 2 3 /** 4 * 5 * @Title: IBanknote.java 6 * @Package: comm.pattern.struct.flyweight 7 * @Description: 印钞版 8 * @author yangzhancheng 9 * @2020年3月19日:下午7:19:46 10 * 11 */ 12 public interface IBanknote { 13 14 //印钞版的面值 15 public void face(); 16 }
C:具体享元:
1 package comm.pattern.struct.flyweight; 2 3 /** 4 * 5 * @Title: Banknote.java 6 * @Package: comm.pattern.struct.flyweight 7 * @Description: 印钞模版 8 * @author yangzhancheng 9 * @2020年3月19日:下午7:22:25 10 * 11 */ 12 public class Banknote implements IBanknote { 13 14 private String face; 15 16 public Banknote (String face){ 17 this.face = face; 18 } 19 20 @Override 21 public void face() { 22 System.out.println("印钞模版的面额是:"+face); 23 } 24 25 }
D:Client:
1 package comm.pattern.struct.flyweight; 2 3 import java.util.HashMap; 4 5 /** 6 * 7 * @Title: Client.java 8 * @Package: comm.pattern.struct.adapter 9 * @Description: 客户端 10 * @author yangzhancheng 11 * @2020年3月18日:下午8:49:23 12 * 13 */ 14 public class Client { 15 16 public static void main(String[] args) { 17 18 BanknoteFactory banknoteFactory = new BanknoteFactory(); 19 20 IBanknote Banknote = banknoteFactory.builder("10元"); 21 Banknote.face(); 22 23 Banknote = banknoteFactory.builder("10元"); 24 Banknote.face(); 25 26 Banknote = banknoteFactory.builder("5元"); 27 Banknote.face(); 28 29 Banknote = banknoteFactory.builder("100元"); 30 Banknote.face(); 31 } 32 33 }
运行结果
没有这个模版,创建模版:10元
印钞模版的面额是:10元
这个模版存在,创建模版:10元
印钞模版的面额是:10元
没有这个模版,创建模版:5元
印钞模版的面额是:5元
没有这个模版,创建模版:100元
印钞模版的面额是:100元
三、总结
与单例模式的比较:
1、享元设计模式是一个类有很多对象,而单例是一个类仅一个对象。
2、享元模式是为了节约内存空间,提升程序性能,而单例模式则主要是出于共享状态的目的。