運用共享技術有效的支持大量細粒度的對象。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
享元模式能夠避免大量很是類似的類的開銷。在程序設計中,有時須要生成大量細粒度的類實例來表示數據。若是能發現這些實例除了幾個參數外基本相同的,有時就可以受大幅度的減小須要實例化的類的數量。若是能把那些參數移到類實例的外面,在方法調用時將它們傳進來,就能夠經過共享大幅度的減小單個實例的數目。設計