设计模式 | 享元模式(Flyweight)
定义:
运用共享技术有效地支持大量细粒度的对象。
结构:(书中图,侵删)
一个享元工厂类
一个抽象享元类
若干需要共享的享元子类
若干不需要共享的享元子类
这里要说两个概念:
内部状态:共享类内部的叫内部状态
外部状态:不在共享类内部的叫外部状态
实例:
享元模式的意义就是使相同或相似的对象共享同一个对象,从而起到节省资源的作用。
书中用到的例子是帮人做网站,很多客户的需求其实是差不多的,但是为每个客户都新建虚拟机,复制一套一套代码,是很浪费资源的事情。
而且一旦有Bug或者需求要修改,工作量也是巨大的,完全可以共享对象。
我想起了自己上大学那会也帮人做过网站,后来人家又介绍了生意过来,我因为上班比较忙就拒绝了,要是早点把设计模式学好,说不定都财富自由了(狗头)
下面的实例用书中提到的另外一个围棋的例子吧。
围棋的棋子都是一样的,只是颜色和位置不同。
抽象棋子接口:
package designpattern.flyweight; public interface Chessman { abstract void position(String position); }
具体棋子类:
package designpattern.flyweight; public class ConcreteChessman implements Chessman { String color; public ConcreteChessman(String color) { this.color = color; } @Override public void position(String position) { System.out.println(color + "棋下在:" + position); } }
棋子工厂类:
package designpattern.flyweight; import java.util.HashMap; import java.util.Map; public class ChessmanFactory { Map<String, Chessman> map = new HashMap<>(); public Chessman getChessman(String color) { if (map.containsKey(color)) { return map.get(color); } else { Chessman chessman = new ConcreteChessman(color); map.put(color, chessman); return chessman; } } }
客户端:
package designpattern.flyweight; public class Client { public static void main(String[] args) { ChessmanFactory factory=new ChessmanFactory(); Chessman cc1= factory.getChessman("黑"); cc1.position("右上星位"); Chessman cc2= factory.getChessman("白"); cc2.position("天元"); Chessman cc3= factory.getChessman("黑"); cc3.position("右上目外"); } }
结果输出:
黑棋下在:右上星位
白棋下在:天元
黑棋下在:右上目外
总结:
不知道该总结些什么了,直接上书中的内容吧:
上面的后半句我没太看明白,所以留给大家自己理解吧。