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; } Collectionshoes = new ArrayList (); 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."; }}