22-享元模式

22-享元模式

概念

享元模式(flyweight),运用共享技术有效地支撑大量细粒度的对象

享元模式可以避免大量非常相似的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目。

使用场景:
如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑享元模式

实践

package com.gof.flyweight;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 功能描述
 *
 * @since 2023-03-03
 */
@Data
@AllArgsConstructor
public class User {

    private String account;

}
package com.gof.flyweight;

/**
 * 功能描述
 *
 * @since 2023-03-03
 */
public abstract class Website {
    public abstract void use(User user);
}
package com.gof.flyweight;

/**
 * 功能描述
 *
 * @since 2023-03-03
 */
public class ConcreteWebsite extends Website {
    private String name;

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

    @Override
    public void use(User user) {
        System.out.println("网站分类:" + name + " 用户:" + user.getAccount());
    }
}
package com.gof.flyweight;

import java.util.HashMap;
import java.util.Map;

/**
 * 功能描述
 *
 * @since 2023-03-03
 */
public class WebsiteFactory {
    private Map<String, Website> websites = new HashMap<>();

    public Website getWebsite(String type) {
        if (websites.containsKey(type)) {
            return websites.get(type);
        } else {
            ConcreteWebsite concreteWebsite = new ConcreteWebsite(type);
            websites.put(type, concreteWebsite);
            return concreteWebsite;
        }
    }

    public int getWebsiteCount() {
        return websites.size();
    }
}
package com.gof.flyweight;

/**
 * 功能描述
 *
 * @since 2023-03-03
 */
public class Client {
    public static void main(String[] args) {
        User user1 = new User("小菜");
        User user2 = new User("大鸟");

        WebsiteFactory factory = new WebsiteFactory();
        Website wx = factory.getWebsite("产品展示");
        wx.use(user1);
        Website wy = factory.getWebsite("产品展示");
        wy.use(user2);
    }
}
posted @ 2023-03-03 10:33  Oh,mydream!  阅读(18)  评论(0编辑  收藏  举报