享元模式(结构型)

 

设计模式的3个分类:创建型模式、结构型模式、行为型模式

 

享元模式定义:

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

 

组合模式图示:

 

 

 

组合模式应用图示:

 

 

组合模式应用代码实现:

//抽象"网站"
public abstract class WebSite {

    public abstract void use(User user);//user为享元模式中的外部状态
}

//具体“网站”
public class ConcreteWebSite extends WebSite {

    //网站发布的类型(享元模式的内部状态)
    private String type = "";

    public ConcreteWebSite(String type) {
        this.type = type;
    }

    @Override
    public void use(User user) {
        System.out.println("网站的发布形式为: " + type + " 在使用中... 使用者为: " + user.getName());
    }
}

/网站工厂类,根据需求返回网站
public class WebSiteFactory {

    //集合,充当池的作用
    private Map<String, ConcreteWebSite> pool = new HashMap<>();

    //根据网站的类型,返回一个网站;如果没有就创建一个网站,并放入到池中
    public WebSite getWebSiteCategory(String type) {
        if (!pool.containsKey(type)) {
            pool.put(type, new ConcreteWebSite(type));
        }
        return pool.get(type);
    }

    //获取网站分类的总数(池中有多少个网站类型)
    public int getWebSiteCount() {
        return pool.size();
    }
}

//User是享元模式中的“外部状态”
public class User {

    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class FlyweightPatternDemo {

    public static void main(String[] args) {


        //创建一个工厂类
        WebSiteFactory factory = new WebSiteFactory();

        //客户要一个以"新闻"形式发布的网站
        WebSite website1 = factory.getWebSiteCategory("新闻");
        website1.use(new User("Tom"));

        //客户要一个以"博客"形式发布的网站
        WebSite website2 = factory.getWebSiteCategory("博客");
        website2.use(new User("Jack"));

        //客户要一个以"博客"形式发布的网站
        WebSite website3 = factory.getWebSiteCategory("博客");
        website3.use(new User("Smith"));

        //客户要一个以"博客"形式发布的网站
        WebSite website4 = factory.getWebSiteCategory("博客");
        website4.use(new User("King"));

        System.out.println("网站的分类共: " + factory.getWebSiteCount());//输出内容:网站的分类共: 2

    }
}

 

应用:

1、系统有大量相似对象。2、需要缓冲池的场景。例如Java中的String,线程池、数据库链接池等。

 

参考:

韩顺平《设计模式》--youtube

  

posted @ 2021-01-04 14:22  黑冰台  阅读(110)  评论(0)    收藏  举报