结构型模式的目的是通过组合类或对象产生更大结构,以适应更高层次的逻辑需求;
结构型模式共有7种:
■ 代理模式
■ 装饰模式
■ 适配器模式
■ 组合模式
■ 桥梁模式
■ 外观模式
■ 享元模式
一、享元模式的简介
■ 享元模式(Flyweight Pattern)是池技术的重要实现方式,可以降低大量重复的、细粒度的类在内存中的开销;
■ 使用共享对象可有效地支持大量的细粒度的对象;
■ Java基础类库中大量使用了享元模式,如String、Integer、Boolean、Character等类都通过享元模式提供了内部的池化机制;
image.png
享元模式4个角色:
■ 抽象享元(Flyweight)角色:
该角色对享元类进行抽象,需要外部状态的操作可以通过参数的形式将外部状态传入;
■ 具体享元(ConcreteFlyweight)角色:
该角色实现抽象享元定义的业务;
注意享元对象的内部状态必须与环境无关;
■ 享元工厂(FlyweightFactory)角色:
该角色就是构造一个池容器,负责创建和管理享元角色;
■ 客户端(Client)角色:
该角色需要自行存储所有享元对象的外部状态;
二、享元模式的优缺点
■ 享元模式的优点:
大幅减少内存中对象的数量,降低程序内存的占用,提高性能;
■ 享元模式的缺点:
享元模式增加了系统的复杂性;
享元模式将享元对象的状态外部化,而读取外部状态使得运行时间变长;
三、享元模式的实例
# 模拟下围棋的过程;
image.png
/**
* 棋子接口
*/
public interface Chesspiece {
/**
* 落子
* @param x 棋子的坐标x
* @param y 棋子的坐标y
*/
void put(int x , int y);
}
/**
* 棋子具体享元
*/
public class ChesspieceFlyweight implements Chesspiece{
/**
* 棋子颜色:黑、白
*/
private String color;
public ChesspieceFlyweight(String color) {
this.color = color;
}
@Override
public void put(int x, int y) {
System.out.println("落子坐标 (" + x + " , " + y + ")");
}
}
/**
* 棋子享元工厂
*/
public class ChesspieceFactory {
/**
* 白子享元
*/
static final ChesspieceFlyweight WHITE = new ChesspieceFlyweight("白");
/**
* 黑子享元
*/
static final ChesspieceFlyweight BLACK = new ChesspieceFlyweight("黑");
/**
* 根据颜色获取棋子享元
* @param color
* @return
*/
public static Chesspiece getChesspiece(String color){
if(color.equals("白")){
return WHITE;
}else{
return BLACK;
}
}
}
/**
* 测试类Game
*/
public class Game {
public static void main(String[] args){
Chesspiece c1 = ChesspieceFactory.getChesspiece("黑");
c1.put(1,1);
Chesspiece c2 = ChesspieceFactory.getChesspiece("白");
c2.put(1,2);
Chesspiece c3 = ChesspieceFactory.getChesspiece("黑");
c3.put(2,1);
Chesspiece c4 = ChesspieceFactory.getChesspiece("白");
c4.put(2,2);
Chesspiece c5 = ChesspieceFactory.getChesspiece("黑");
c5.put(3,1);
Chesspiece c6 = ChesspieceFactory.getChesspiece("白");
c6.put(3,2);
}
}
# 控制台输出 :
落子坐标 (1 , 1)
落子坐标 (1 , 2)
落子坐标 (2 , 1)
落子坐标 (2 , 2)
落子坐标 (3 , 1)
落子坐标 (3 , 2)
参考:
摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)
网友评论