您的位置:首页 > 编程语言 > Java开发

java设计模式(十一)--享元模式

2017-08-18 00:00 399 查看
对于享元模式,在我看来就是为解决庞大的小对象而生的,我感觉他和单例模式是差不多的,都是产生一个实例,避免实例的重复创建,他们是有区别的,单例模式所做的就是单纯的创建唯一一个实例的工作。
网络上对享元模式的解释:
此模式用于减少创建对象的数量,以减少内存占用并提高性能,此模式尝试重用现有的同类对象,如果未找到匹配的对象,就创建对象。

实例:用享元模式来创建不同颜色的小汽车。
以下就是我所画的类图:



以下是我对实例的实现所完成的代码:

1.实体类的接口及其实现类

interface Vehicle {
void produce();
}

public class Car implements Vehicle {
private String color;
public Car(String color) {
this.color = color;
}
@Override
public void produce() {
System.out.println("Car [color=" + color + "]");
}
}

2.实体创建类

public class VehicleFactory {
private static Map<String,Vehicle> vehicles=new HashMap<String, Vehicle>();
public Car getCar(String color){
Car car=(Car) vehicles.get(color);
if(car==null){
System.out.println("========================");
System.out.println("create a "+color+" car");
car=new Car(color);
vehicles.put(color, car);
}
return car;
}
}

3.测试类

public class Test {
private static final String[] colors={"red","green","black","blue","white"};
public static void main(String[] args) {
Random r=new Random();
VehicleFactory factory=new VehicleFactory();
Car car=null;
//生产20辆车
for(int i=0;i<20;i++){
car=factory.getCar(colors[r.nextInt(5)]);
car.produce();
}
}
}

4.后台输出

========================
create a white car
Car [color=white]
========================
create a blue car
Car [color=blue]
Car [color=blue]
========================
create a green car
Car [color=green]
========================
create a black car
Car [color=black]
Car [color=blue]
Car [color=black]
========================
create a red car
Car [color=red]
Car [color=red]
Car [color=green]
Car [color=green]
Car [color=white]
Car [color=black]
Car [color=black]
Car [color=blue]
Car [color=green]
Car [color=green]
Car [color=white]
Car [color=blue]
Car [color=white]

这个模式通过HashMap集合的属性,以其中的得内部状态---颜色作为键,与此颜色对应的汽车类作为值,在调用每个车的方法前会判断是否存在该颜色的车,如果没有就会创建,有的话就会免去创建步骤,使用之前创建过的该类对象,从而避免了重复类的创建。
但是,由于创建该类的方法是在该类外进行的,并且产生的还是不确定的对象,所以这就把对象的状态外部化了,由于不确定的外部状态变多,使得系统变得复杂化,并且在访问外部状态时会使运行时间变长。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: