java设计模式- Flyweight 享元模式
1) Flyweight 享元模式的定义?
运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的又橡来大幅度减少需要创建 的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。
2)Flyweight 享元模式优点与缺点?
优点
相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的 压力。
缺点
1. 为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性。
2. 读取享元模式的外部状态会使得运行时间稍微变长。
3) Flyweight 享元模式主要包含那些角色?
- 抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口, 非享元的外部状态以参数的形式通过方法传入。
- 具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。
借出一本书:java基础 借出一本书:java高级 借出一本书:分布式微服 借出一本书:java基础 借出一本书:分布式微服 一共借了:5书 图书馆实际借出:3书 - 非享元(Unsharable Flyweight)角色:是不可以共享的外部状态,它以参数的形式注入具体享元 的相关方法中。
- 享元工厂(Flyweight Factory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象 时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的 话,则创建一个新的享元对象。
4) Flyweight 享元模式的应用场景?
1.系统中存在大量相同或相似的对象,这些对象耗费大量的内存资源。
2大部分的对象可以按照内部状态进行分组,且可将不同部分外部化,这样每一个组只需保存一个内 部状态。
3.由于享元模式需要额外维护一个保存享元的数据结构,所以应当在有足够多的享元实例时才值得使 用享元模式。
类的结构表
类的结构图
代码
package flyweightexample2;
import java.util.ArrayList;
import java.util.List;
/**
* 测试类
* @author 17717
*
*/
public class App {
private static List<RegisterCarInfo> list=new ArrayList<>();
public static void main(String[] args) {
CarFactory carFactory=new CarFactory();
RegisterCarInfo registerCarInfo1=new RegisterCarInfo(carFactory.getCar("宝马750"),"张三","1999-04-04","豫C 33569");
RegisterCarInfo registerCarInfo2=new RegisterCarInfo(carFactory.getCar("宝马750"),"李四","2000-04-04","豫C 34569");
RegisterCarInfo registerCarInfo3=new RegisterCarInfo(carFactory.getCar("比亚迪3"),"赵四","2015-03-14","豫A 55569");
list.add(registerCarInfo1);
list.add(registerCarInfo2);
list.add(registerCarInfo3);
for (int i = 0; i<list.size(); i++) {
list.get(i).show();
}
System.out.println("实际创建的车辆信息对象:"+carFactory.getSize());
}
}
具体的享元对象
package flyweightexample2;
/**
* 享元对象
* @author 17717
*
*/
public class Car {
private String make;//生产厂商
private String model;//型号
private String year;//生产日期
public Car(String make, String model, String year) {
this.make = make;
this.model = model;
this.year = year;
}
public void info(){
System.out.println("生产厂商:"+make);
System.out.println("型号:"+model);
System.out.println("生产日期:"+year);
}
}
享元对象工厂类
package flyweightexample2;
import java.util.HashMap;
import java.util.Map;
public class CarFactory {
private Map<String,Car> map=new HashMap<>();
private Car bm=new Car("北汽","宝马750","1992");
private Car byd=new Car("比亚迪","比亚迪3","2012");
public CarFactory(){
map.put("宝马750",bm);
map.put("比亚迪3",byd);
}
public void createNewCar(String make, String model, String year){
map.put(model,new Car(make,model,year));
}
public Car getCar(String model){
return map.get(model);
}
public int getSize(){
return map.size();
}
}
非享元角色,享元对象组合到当前类中
package flyweightexample2;
public class RegisterCarInfo {
private Car car;
private String owner;
private String dengjitime;
private String carNumber;
public RegisterCarInfo(Car car, String owner, String dengjitime, String carNumber) {
this.car = car;
this.owner = owner;
this.dengjitime = dengjitime;
this.carNumber = carNumber;
}
public void show(){
System.out.println("--------车辆登记信息--------");
car.info();
System.out.println("所有人:"+owner);
System.out.println("登记时间:"+dengjitime);
System.out.println("车牌号:"+carNumber);
}
}
测试结果: