java设计模式---享元模式

java设计模式- Flyweight 享元模式

1) Flyweight 享元模式的定义?
运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的又橡来大幅度减少需要创建 的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。
2)Flyweight 享元模式优点与缺点?
优点
相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的 压力。
缺点
1. 为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性。
2. 读取享元模式的外部状态会使得运行时间稍微变长。
3) Flyweight 享元模式主要包含那些角色?

  1. 抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口, 非享元的外部状态以参数的形式通过方法传入。
  2. 具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。
    借出一本书:java基础 借出一本书:java高级 借出一本书:分布式微服 借出一本书:java基础 借出一本书:分布式微服 一共借了:5书 图书馆实际借出:3书
  3. 非享元(Unsharable Flyweight)角色:是不可以共享的外部状态,它以参数的形式注入具体享元 的相关方法中。
  4. 享元工厂(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);
    }
}


测试结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值