简单梳理享元模式
享元模式的实现
如果你是个程序员,经常接私活,可能会遇到如下的问题,
比如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