享元模式FlyWeight
场景:如果有很多个完全相同或者相似的对象,可以节省内存资源
核心:
享元模式以共享的方式高效地支持大量细粒对象的重用
享元对象做到共享的关键是区分了内部状态和外部状态:
内部状态:可以共享,不会随环境变化而变化(共有的部分)
外部状态:不可以共享,会随环境变化而改变(独特的部分)
享元模式的实现:
-FlyweightFactory享元工厂类:创建并管理享元对象,享元池一般设计成键值对
-FlyWeight抽象享元类 :通常是一个接口或抽象类 声明公共方法,这些方法可以向外界提供对象的内部状态 设置外部状态
-ConcreteFlyWeight具体享元类:为内部状态提供成员变量进行储存
-UnsharedConcreteFlyWeught非共享享元类:不能被共享的子类可以设计成非共享享元类
在实际中的场景:线程池,数据库连接池,String类
优点:极大减少内存中对象的数量;相同或者相似的对象只存一份,节约资源;外部状态相对独立,不影响内部状态
缺点:模式复杂,程序逻辑复杂化;为了节省内存,共享了内部状态,分理出外部状态,读取外部状态使运行时间变长,时间换取空间
例如:围棋(内部状态:颜色形状大小 外部状态:位置)
/**
* 外部状态类UnsharedConcreteFlyWeight
* @author 小帆敲代码
*
*/
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
* 外部状态类UnsharedConcreteFlyWeight
* @author 小帆敲代码
*
*/
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
return x;
}
public void setX(int x) {
this.x = x;
}
this.x = x;
}
public int getY() {
return y;
}
return y;
}
public void setY(int y) {
this.y = y;
}
this.y = y;
}
}
/**
* 享元类
* @author 小帆敲代码
*
*/
public interface Chess {
void setColor(String color);
String getColor();
void display(Point p);
}
class ConcreteChess implements Chess{
private String color;
public ConcreteChess(String color) {
this.color = color;
}
* 享元类
* @author 小帆敲代码
*
*/
public interface Chess {
void setColor(String color);
String getColor();
void display(Point p);
}
class ConcreteChess implements Chess{
private String color;
public ConcreteChess(String color) {
this.color = color;
}
@Override
public void setColor(String color) {
this.color=color;
}
public void setColor(String color) {
this.color=color;
}
@Override
public String getColor() {
return this.color;
}
public String getColor() {
return this.color;
}
@Override
public void display(Point p) {
System.out.println(color+"棋"+"在("+p.getX()+","+p.getY()+")点显示");
}
}
public void display(Point p) {
System.out.println(color+"棋"+"在("+p.getX()+","+p.getY()+")点显示");
}
}
/**
* 享元工厂
* @author 小帆敲代码
*
*/
public class FlyWeightFactory {
//享元池
private static Map<String,Chess> map=new HashMap<String,Chess>();
public static Chess getChess(String color) {
if(!map.containsKey(color)) {
map.put(color, new ConcreteChess(color));
}
return map.get(color);
}
}
* 享元工厂
* @author 小帆敲代码
*
*/
public class FlyWeightFactory {
//享元池
private static Map<String,Chess> map=new HashMap<String,Chess>();
public static Chess getChess(String color) {
if(!map.containsKey(color)) {
map.put(color, new ConcreteChess(color));
}
return map.get(color);
}
}
public class Client {
public static void main(String[] args) {
Chess c1=FlyWeightFactory.getChess("黑");
Chess c2=FlyWeightFactory.getChess("黑");
System.out.println(c1);
System.out.println(c2);
System.out.println("增加外部状态-----");
c1.display(new Point(10,10));
c2.display(new Point(15,15));
}
}
public static void main(String[] args) {
Chess c1=FlyWeightFactory.getChess("黑");
Chess c2=FlyWeightFactory.getChess("黑");
System.out.println(c1);
System.out.println(c2);
System.out.println("增加外部状态-----");
c1.display(new Point(10,10));
c2.display(new Point(15,15));
}
}