设计模式之享元模式
FlyWeight(享元模式)
一、享元模式简介
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象
核心:
- 1、运用共享技术有效地支持大量细粒度的对象
- 2、用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象
- 3、享元对象能做到共享的关键是区分了内部状态和外部状态 === • 内部状态:可以共享,不会随环境变化而改变 • 外部状态:不可以共享,会随环境变化而改变
二、享元模式优缺点比较
优点:
- 1、大大减少对象的创建,降低系统的内存,使效率提高
缺点:
- 1、提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱
使用场景:
- 1、系统有大量相似对象(String类)
- 2、需要缓冲池的场景(线程池、数据库连接池)
注意事项:1、注意划分外部状态和内部状态,否则可能会引起线程安全问题。 2、这些类必须有一个工厂对象加以控制。
三、UML类图

四、设计实现
步骤1:创建享元抽象接口类
//通常是一个接口或抽象类,声明公共方法,这些方法可以向外界提供对象 的内部状态,设置外部状态 public interface ChessFlyWeight { String getColor(); void display(Coordinate c); }
步骤2:创建实现享元抽象接口具体实现类
public class ConcreteChess implements ChessFlyWeight { private String color; public ConcreteChess(String color) { this.color = color; } @Override public String getColor() { return color; } @Override public void display(Coordinate c) { System.out.println("棋子颜色为:"+color+"---棋子位置:x="+c.getX()+",y="+c.getY()); } }
步骤3:创建非共享享元类
/** * UnsharedConcreteFlyWeight 非共享享元类 * 不能被共享的子类可以设计为非共享享元类 */ public class Coordinate { private int x,y; public Coordinate(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }
步骤4:创建享元工厂方法类
//创建并管理享元对象,享元池一般设计成键值对 public class FlyWeightFactory { private static Map<String,ChessFlyWeight> map = new HashMap<>(); public static ChessFlyWeight getFlyWeight(String str) { if(map.get(str)!=null) { return (ChessFlyWeight)map.get(str); }else { ChessFlyWeight cfw = new ConcreteChess(str); map.put(str, cfw); return cfw; } } }
步骤5:调用者调用
public class FlyWeightDemo01 { public static void main(String[] args) { ChessFlyWeight cfw = FlyWeightFactory.getFlyWeight("黑色"); ChessFlyWeight cfw1 = FlyWeightFactory.getFlyWeight("黑色"); System.out.println(cfw); System.out.println(cfw1); cfw.display(new Coordinate(10, 10)); cfw1.display(new Coordinate(20, 20)); } }
步骤5:运行程序,观察结果

posted on 2020-04-05 23:50 VincentYew 阅读(246) 评论(0) 收藏 举报
浙公网安备 33010602011771号