概念:就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。
Flyweight(享元)模式中常出现Factory模式。Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对
象存储池(Flyweight Pool)来存放内部状态的对象。
Flyweight的关键思路,在于:
新建对象时:先到hashtable中进行获取-->判断取得对象是否为空-->若是,则新建此对象,且放回hashtable -->若存在,则共享原来
的对象.
实例代码:
public interface Car { public void showCarName(); } public class BMWCar implements Car { private String name; public BMWCar(String name){ this.name=name; } public void setName(String name){ this.name=name; } public String getName(){ return this.name; } @Override public void showCarName() { // TODO Auto-generated method stub System.out.println("I am BWM car."); } } public class FordCar implements Car { public String name; public FordCar(String name) { this.name = name; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } @Override public void showCarName() { // TODO Auto-generated method stub System.out.println("I am a Ford car."); } } import java.util.Hashtable; public class FlyWeightFactory { public static Car car; private static Hashtable<String, Car> carPool = new Hashtable<String, Car>(); public static Car getCar(String name) { if ("BMW".equals(name)) { car = carPool.get(name); if (car == null) { car = new BMWCar("nan"); carPool.put(name, car); } } else if ("Ford".equals(name)) { car = carPool.get(name); if(car==null){ car=new FordCar("xi"); carPool.put(name, car); } } return car; } public static int getNumber(){ return carPool.size(); } } public class test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Car car,car1,car2; car=FlyWeightFactory.getCar("BMW"); car.showCarName(); car1=FlyWeightFactory.getCar("Ford"); car1.showCarName(); car2=FlyWeightFactory.getCar("BMW"); if(car==car2){ System.out.println("we are the same car."); }else{ System.out.println("we are different car."); } System.out.println(FlyWeightFactory.getNumber()); } }
运行结果:
I am BWM car.
I am a Ford car.
we are the same car.
2