目的:为了节省目的,将相同部分提取出来存放到一个类(里面调用不同功能的对象),不同的地方另存一个类,通过工厂模式来调用方法,判断相同部分是否创建,若没创建,则创建,若已创建,只需要往此类中添加不同部分即可。(其中享元工厂和享元池非常重要,是节省内存的关键)
/**
* 享元类(棋子状态类)
*/
public interface ChessFlyWeight{
void setColor(String color);
String getColor();
//调用外部状态
void display(Location location);
}
/**
* 外部状态(棋子的位置)
*/
public class Location{
int x;
int y;
get/set;
}
//享元类的实现类
public class ShareChess implements ChessFlyWeight{
private String color;
public ShareChess(String color){
this.color = color;
}
public void setColor(String color){
this.color=color;
}
public String getColor(){
return color;
}
public void play(Location location){
System.out.println("棋子的颜色:" + color);
System.out.println("棋子的位置"+ location.getX()+" "+location.getY());
}
}
//享元工厂
public class ChessFlyWeightFactory{
//享元池
private static Map<String,ChessFlyWeight> map = new HashMap<String,ChessFlyWeight>();
public static ChessFlyWeight getChess(String color){
//查询集合中是否存在这个对象
if(map.get(color) != null){
//存在就返回这个对象
return map.get(color);
}else{
//不存在就创建,然后放到集合中。
ChessFlyWeight cfw = new ShareChess(color);
map.put(color,cfw);
return cfw;
}
}
}
测试类
public class Demo{
public static void main(String[] args){
//创建黑色棋子
ChessFlyWeight chess1 = ChessFlyWeightFactory.getChess("黑色");
//下棋到位置(1,1)
chess1.display(new Location(1,1));
//之后只需要管下棋位置即可,不用开辟颜色的内存,减少内存的使用。
}
}