设计模式之享元模式

  1. 简单梳理享元模式
    1. 享元模式的实现
      1. 定义业务方法
      2. 执行结果
      3. 结果分析
  2. 联系作者
    1. 微信公众号
    2. QQ群

简单梳理享元模式

享元模式的实现

如果你是个程序员,经常接私活,可能会遇到如下的问题,
比如A客户找你做个网站,B客户又找你做个网站,大体相同但又有细微差异,该怎么做的?
没错,复制一份改改,但是又来个C客户找你做个网站呢?D客户E客户F客户呢?
总不能来一个客户就复制一份,那后期的维护工作累就爆发式增加了。

我们来看下这种场景如何用设计模式来实现。

首先我们定义个User类,用来维护不同的客户

public class User {
    private String name;

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

    public String getName() {
        return name;
    }

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

网站基类

//网站抽象类
public abstract class Website {
    public abstract void Use(User user);
}

网站的具体实现类,当然,继承自网站基类

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.getName());
    }
}

再来个网站工厂,用来生成客户要求的网站

//网站工厂
public class WebsiteFactory {
    public Hashtable flyweights = new Hashtable();

    public Website GetWebsiteCategory(String key){
        if(!flyweights.containsKey(key)){
            flyweights.put(key, new ConcreteWebsite(key));
        }
        return (Website) flyweights.get(key);
    }

    public int GetWebsiteCount(){
        return flyweights.size();
    }
}

这样我们前期的定义就算做完了,
然后我们看具体应用中的使用。

定义业务方法

看在具体业务逻辑中如何使用

public class FlyweightTest {
    public static void main(String[] args) {
        //享元模式
        func1();
    }

    public static void func1(){
        WebsiteFactory wf = new WebsiteFactory();
        Website w1 = wf.GetWebsiteCategory("产品展示");
        w1.Use(new User("用户1"));

        Website w2 = wf.GetWebsiteCategory("产品展示");
        w2.Use(new User("用户2"));

        Website w3 = wf.GetWebsiteCategory("产品展示");
        w3.Use(new User("用户3"));

        Website w4 = wf.GetWebsiteCategory("博客");
        w4.Use(new User("用户4"));

        Website w5 = wf.GetWebsiteCategory("博客");
        w5.Use(new User("用户5"));

        Website w6 = wf.GetWebsiteCategory("博客");
        w6.Use(new User("用户6"));

        System.out.println("网站分类总数为:"+wf.GetWebsiteCount());

    }
}

执行结果

网站分类:产品展示,用户:用户1
网站分类:产品展示,用户:用户2
网站分类:产品展示,用户:用户3
网站分类:博客,用户:用户4
网站分类:博客,用户:用户5
网站分类:博客,用户:用户6
网站分类总数为:2

结果分析

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

享元模式可以避免大量非常相似类的开销

联系作者

微信公众号

xiaomingxiaola
(BossLiu)

QQ群

58726094


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 384276224@qq.com

×

喜欢就点赞,疼爱就打赏

日记本 网文世界