设计模式之享元模式

如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用都创建新的对象。目的是提高系统性能。

享元模式(Flyweight),运行共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。

下面是Java中自带的一种享元模式

public class TestString {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");
        String s4 = new String("abc");

        System.out.println(s1 == s2); // true
        System.out.println(s1 == s3); // false
        System.out.println(s3 == s4); // false
        System.out.println(s3.intern() == s1); // true
        System.out.println(s3.intern() == s4.intern()); // true
    }
}

下面是另一个例子

建筑接口:Building

public interface Building {
   void use();
}

体育馆实现类:Gym

public class Gym implements Building {
    private String name;
    private String shape;
    private String sport;

    public Gym(String sport) {
        this.setSport(sport);
    }

    public String getName() {
        return name;
    }

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

    public String getShape() {
        return shape;
    }

    public void setShape(String shape) {
        this.shape = shape;
    }

    public String getSport() {
        return sport;
    }

    public void setSport(String sport) {
        this.sport = sport;
    }

    @Override
    public void use() {
        System.out.println("该体育馆被使用来召开奥运会" + "  运动项目为:" + sport + "  形状为:" + shape + "  名称为:" + name);
    }
}

建筑工厂类:GymFactory

import java.util.*;

public class GymFactory {
    private static final Map<String, Gym> gymMap = new HashMap<>();

    public static Gym getGym(String sport) {
        Gym gym = gymMap.get(sport);
        if (gym == null) {
            gym = new Gym(sport);
            gymMap.put(sport, gym);
        }
        return gym;
    }

    public static int getSize() {
        return gymMap.size();
    }
}

测试类:Client

public class Client {
    public static void main(String[] args) {
        String sport = "足球";
        for (int i = 1; i <= 5; i++) {
            Gym tyg = GymFactory.getGym(sport);
            tyg.setName("中国体育馆");
            tyg.setShape("圆形");
            tyg.use();
            System.out.println("对象池中对象数量为:" + GymFactory.getSize());
        }
    }
}

执行结果:

alt

全部评论

相关推荐

诨号无敌鸭:恭喜佬,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务