package JAVABasic; import java.util.ArrayList; import java.util.Collection; /** * 享元模式的核心思想就是将内部状态相同的对象在存储时进行缓存。 * 也就是说同一颜色同一尺寸的皮鞋,咱们在内存中只保留一份实例, * 在访问对象时,咱们访问的实际上是对象缓存的版本,而不是每次都从新生成对象。 * @author markGao * */ public class FlyweightMode { public static void main(String[] args) { Shoe shoe = ShoeFactory.getInstance().getSheo("BLACK", 42, "A"); System.out.print(shoe.toString()); } } /** * 因为享元模式禁止生成新的对象,因此在使用享元模式时,一般伴随着工厂方法的应用。 * @author markGao * */ class ShoeFactory { private static ShoeFactory sf = null; private ShoeFactory() { } public static ShoeFactory getInstance(){ if(null == sf){ sf = new ShoeFactory(); } return sf; } Collection<Shoe> shoes = new ArrayList<Shoe>(); public Shoe getSheo(String color, int size, String position) { if(!shoes.isEmpty()) { // 首先在缓存中查找对象 for (Shoe shoe : shoes) { if (null == shoe) { continue; } if (shoe.getColor() == color && shoe.getSize() == size) { // 在缓存中命中对象后还原对象的外部属性 shoe.setPosition(position); return shoe; } } } // 若是缓存未命中则新建对象并加入缓存 Shoe shoe = new Shoe(); shoe.setColor(color); shoe.setSize(size); shoe.setPosition(position); shoes.add(shoe); return shoe; } } class Shoe { /** * 其中颜色和尺寸为皮鞋的天然状态,咱们称之为对象内部状态, * 这些状态数据只与对象自己有关,不随外界环境的改变而发生变化。 */ private String color; private int size; /** * 来看库存位置,咱们将这个状态称为对象的外部状态, * 外部状态与对象自己无必然关系,外部状态老是由于外界环境的改变而变化, * 也就是说外部状态是由外界环境来决定的。 * 在本例中,皮鞋今天放在A仓库,明天可能放在B仓库,但不管存放在哪一个仓库, * 同一只皮鞋就是同一只皮鞋, * 它的颜色和尺寸不会随着存放位置的不一样而发生变化。 */ private String position; public Shoe(){ } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } public String toString() { return "The shoe color is: " + color + "; The shoe size is: " + size + "; The shoe position is in " + position + " Area."; } }