运用共享技术有效的支持大量细粒度的对象。ide
实际开发当中,一个项目若是作得好,若是市场打通到其余地方,那么核心代码实际上是能够通用的,只不过用着不一样的数据和特性出来的模版而已,这些对用户来讲是非透明的。使用最小的开销得到最大的收益,这是全部公司的目的。网站
/** * 网站抽象类 * 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()); } }
运行结果this
网站分类:产品展现 用户:路飞 网站分类:产品展现 用户:索隆 网站分类:产品展现 用户:山治 网站分类:博客 用户:娜美 网站分类:博客 用户:乌索普 网站分类:博客 用户:乔巴 网站分类总数为:2
享元模式能够避免大量很是类似的类的开销。在程序设计中,有时须要生成大量细粒度的类实例来表示数据。若是能发现这些实例除了几个参数外基本相同的,有时就可以受大幅度的减小须要实例化的类的数量。若是能把那些参数移到类实例的外面,在方法调用时将它们传进来,就能够经过共享大幅度的减小单个实例的数目。设计