运用共享技术有效的支持大量细粒度的对象。
实际开发当中,一个项目如果做得好,如果市场打通到其他地方,那么核心代码其实是可以通用的,只不过用着不同的数据和特性出来的模版而已,这些对用户来说是非透明的。使用最小的开销获得最大的收益,这是所有公司的目的。
/** * 网站抽象类 * created by callmedevil on 2019/12/15. */ public abstract class website { public abstract void use(user user); }
/** * 具体网站类 * created by callmedevil on 2019/12/15. */ 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()); } }
/** * 网站工厂 * created by callmedevil on 2019/12/15. */ public class websitefactory { private hashmap<string, website> flyweights = new hashmap<>(); // 获得网站分类 public website getwebsitecategory(string key){ // 判断是否存在这个对象,如果存在则直接返回,若不存在则实例化再返回 if (!flyweights.containskey(key)) { flyweights.put(key, new concretewebsite(key)); } return flyweights.get(key); } // 获得网站分类总数 public int getwebsitecount(){ return flyweights.size(); } }
/** * 用户 * created by callmedevil on 2019/12/15. */ public class user { private string name; public user(string name){ this.name = name; } // 省略 get set }
public class test { public static void main(string[] args) { websitefactory factory = new websitefactory(); website fx = factory.getwebsitecategory("产品展示"); fx.use(new user("路飞")); // 共享上方生成的对象,不再实例化 website fy = factory.getwebsitecategory("产品展示"); fy.use(new user("索隆")); website fz = factory.getwebsitecategory("产品展示"); fz.use(new user("山治")); website fl = factory.getwebsitecategory("博客"); fl.use(new user("娜美")); website fm = factory.getwebsitecategory("博客"); fm.use(new user("乌索普")); website fn = factory.getwebsitecategory("博客"); fn.use(new user("乔巴")); // 统计实例化个数,结果应为2 system.out.println("网站分类总数为:" + factory.getwebsitecount()); } }
运行结果
网站分类:产品展示 用户:路飞 网站分类:产品展示 用户:索隆 网站分类:产品展示 用户:山治 网站分类:博客 用户:娜美 网站分类:博客 用户:乌索普 网站分类:博客 用户:乔巴 网站分类总数为:2
享元模式可以避免大量非常相似的类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本相同的,有时就能够受大幅度的减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传进来,就可以通过共享大幅度的减少单个实例的数目。
如对本文有疑问, 点击进行留言回复!!
网友评论