Java设计模式 之 享元模式

Java设计模式 之 享元模式

假设现在我们需要根据不同手机电路板进行构造手机,我们新建电路板类,代码如下:

手机电路板类:

public class PhoneBoard{

    private String name;
    private int count = 0;

    public void setName(String name) {
        this.name = name;
    }

    public void build() {
        count++;
        System.out.println(name + " board build phone - " + count);
    }
}
public class PhoneDemo {

    public static void main(String[] args) {

        // 假设构造3种电路板来制造手机
        for (int i = 0; i < 50; i++) {
            String type = getRandomType();
            PhoneBoard board = new PhoneBoard();
            board.setName(type);
            board.build();
        }

    }

    public static String getRandomType() {
        int random = (int) (Math.random() * 10);
        String type = "Xiaomi";
        if (random < 3) {
            type = "iPhone";
        }else if(random < 6) {
            type = "Huawei";
        }
        return type;
    }

}
// Huawei board build phone - 1
// Huawei board build phone - 1
// iPhone board build phone - 1
// Huawei board build phone - 1
// Huawei board build phone - 1
// Xiaomi board build phone - 1
// Xiaomi board build phone - 1
// ...

上述代码虽然可以完成我们的任务,但我们发现相同的电路板只被使用了一次就不在使用了,造成了资源浪费,那我们怎么样才重复利用这些对象呢?

享元模式实现

这时候我们用享元模式来实现我们的功能,我们利用HashMap将他们存储起来,代码如下:

// 可以不单独使用一个类来实现,这里为了直观

public class PhoneFactory {

    private static HashMap<String, PhoneBoard> mPhones = new HashMap<>();

    public static PhoneBoard createPhone(String type) {
        PhoneBoard board = mPhones.get(type);
        if(board == null) {
            board = new PhoneBoard();
            board.setName(type);
            mPhones.put(type, board);
        }   
        return board;
    }
}

再次请求50次:

public class PhoneDemo {

    public static void main(String[] args) {

        for (int i = 0; i < 50; i++) {
            String type = getRandomType();
            PhoneBoard board = PhoneFactory.createPhone(type);
            board.build();
        }
    }

    public static String getRandomType() {
        int random = (int) (Math.random() * 10);
        String type = "Xiaomi";
        if (random < 3) {
            type = "iPhone";
        }else if(random < 6) {
            type = "Huawei";
        }
        return type;
    }

}

// iPhone board build phone - 1
// Huawei board build phone - 1
// iPhone board build phone - 2
// Xiaomi board build phone - 1
// Huawei board build phone - 2
// Xiaomi board build phone - 2
// Huawei board build phone - 3
// iPhone board build phone - 3
// iPhone board build phone - 4
// iPhone board build phone - 5
// Huawei board build phone - 4
// Xiaomi board build phone - 3
// Huawei board build phone - 5
// Huawei board build phone - 6
// Xiaomi board build phone - 4
// Huawei board build phone - 7
// ...

我们发现电路板对象被利用了起来,这就是享元模式 ,相对是比较容易的,最后我们来总结下 享元模式。

享元模式

目的:运用共享技术有效地支持大量细粒度的对象。
主要解决:
在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
何时使用:
1、系统中有大量对象。
2、这些对象消耗大量内存。
3、这些对象的状态大部分可以外部化。
4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
5、系统不依赖于这些对象身份,这些对象是不可分辨的。
如何解决:用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。
关键代码: 用 HashMap 存储这些对象

其他模式可点击链接进目录阅读了解:http://blog.csdn.net/xiao_wanzi94/article/details/78118092

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值