先来看类图:
//抽象享元角色
public abstract class AbstractBox {
//获取图形的方法
public abstract String getShape();
//显示图形及颜色
public void display(String color){
System.out.println("方块形状: "+getShape()+",颜色为:"+color);
}
}
//G图形类(具体享元角色)
public class GBox extends AbstractBox {
@Override
public String getShape() {
return "G";
}
}
//H图形类(具体享元角色)
public class HBox extends AbstractBox {
@Override
public String getShape() {
return "H";
}
}
//I图形类(具体享元角色)
public class IBox extends AbstractBox {
@Override
public String getShape() {
return "I";
}
}
提供了一个工厂类(BoxFactory),用来管理享元对象(也就是AbstractBox子类对象),该工厂类对象只需要一个,所以可以使用单例模式。并给工厂类提供一个获取形状的方法。
// 工厂类,将该类设计为单例
public class BoxFactory {
private HashMap<String,AbstractBox> map;
//在构造方法中进行初始化操作
public BoxFactory(){
map=new HashMap<>();
map.put("I",new IBox());
map.put("G",new GBox());
map.put("H",new HBox());
}
//提供一个方法获取该工厂类对象
public static BoxFactory getInstance(){
return factory;
}
//饿汉式单例
private static BoxFactory factory=new BoxFactory();
//根据名称获取图形对象
public AbstractBox getShape1(String name){
return map.get(name);
}
}
public class Client {
public static void main(String[] args) {
//获取I图形对象
AbstractBox box1 = BoxFactory.getInstance().getShape1("I");
box1.display("灰色");
//获取G图形对象
AbstractBox box2 = BoxFactory.getInstance().getShape1("G");
box2.display("黑色");
//获取H图形对象
AbstractBox box3 = BoxFactory.getInstance().getShape1("H");
box3.display("红色");
//获取H图形对象
AbstractBox box4 = BoxFactory.getInstance().getShape1("H");
box4.display("蓝色");
System.out.println("两次获取到的H图形对象是否是同一个对象:" + (box3 == box4));
}
}
Integer类使用了享元模式