设计模式_22:享元模式

来源:互联网 发布:lua 人工智能 编辑:程序博客网 时间:2024/05/22 13:24

书上的原句:

享元模式:运用共享技术有效地支持大量细粒度的对象。

栗子来了:

我们写了一个网站,现在要把这个产品卖给不同的用户,但为了节省资源,我们可以把相同类型的网站公用一个服务器和数据库,而不用重新购买服务器和申请多个域名了(也就是不用重复new同类别的对象)。

import java.util.HashMap;import java.util.Map;public class Main {    public static void main(String[] args) {        WebsiteFactory factory = new WebsiteFactory();        AbstractWebsite lt1 = factory.getWebsite("论坛");        lt1.use();        AbstractWebsite lt2 = factory.getWebsite("论坛");        lt2.use();        AbstractWebsite lt3 = factory.getWebsite("论坛");        lt3.use();        AbstractWebsite bk1 = factory.getWebsite("博客");        bk1.use();        AbstractWebsite bk2 = factory.getWebsite("博客");        bk2.use();        System.out.println("网站分类总数:" + factory.getWebsiteCount());    }}//抽象网站abstract class AbstractWebsite {    abstract void use();}//具体网站class Website extends AbstractWebsite {    private String name;    public Website(String name) {        this.name = name;    }    @Override    void use() {        System.out.println("网站分类:" + name);    }}//网站工厂类class WebsiteFactory {    private Map<String, AbstractWebsite> flyweights = new HashMap<>();    public AbstractWebsite getWebsite(String key){        //只有key不存在的情况下才会new对象        if (!flyweights.containsKey(key)){            flyweights.put(key, new Website(key));        }        return flyweights.get(key);    }    //获取实际网站的个数    public int getWebsiteCount(){        return flyweights.size();    }}

运行结果:

网站分类:论坛网站分类:论坛网站分类:论坛网站分类:博客网站分类:博客网站分类总数:2

可以看到,我们卖给用户5个网站,其实只要写两个网站就行了。


但一般情况下我们的网站是不会一模一样的,例如用户数据等,因此遇到这种情况,我们可以用外界的参数传入实现:

import java.util.HashMap;import java.util.Map;public class Main {    public static void main(String[] args) {        WebsiteFactory factory = new WebsiteFactory();        AbstractWebsite lt1 = factory.getWebsite("论坛");        lt1.use(new User("小鸟"));        AbstractWebsite lt2 = factory.getWebsite("论坛");        lt2.use(new User("大鸟"));        AbstractWebsite lt3 = factory.getWebsite("论坛");        lt3.use(new User("菜鸟"));        AbstractWebsite bk1 = factory.getWebsite("博客");        bk1.use(new User("弱鸡"));        AbstractWebsite bk2 = factory.getWebsite("博客");        bk2.use(new User("大大"));        System.out.println("网站分类总数:" + factory.getWebsiteCount());    }}class User {    private String name;    public User(String name) {        this.name = name;    }    public String getName() {        return name;    }}abstract class AbstractWebsite {    abstract void use(User user);}class Website extends AbstractWebsite {    private String name;    public Website(String name) {        this.name = name;    }    //参数User从这里传入    @Override    void use(User user) {        System.out.println("网站类别:" + name + " 用户:" + user.getName());    }}class WebsiteFactory {    private Map<String, AbstractWebsite> flyweights = new HashMap<>();    public AbstractWebsite getWebsite(String key){        if (!flyweights.containsKey(key)){            flyweights.put(key, new Website(key));        }        return flyweights.get(key);    }    public int getWebsiteCount(){        return flyweights.size();    }}

运行结果:

网站类别:论坛 用户:小鸟网站类别:论坛 用户:大鸟网站类别:论坛 用户:菜鸟网站类别:博客 用户:弱鸡网站类别:博客 用户:大大网站分类总数:2




原创粉丝点击