享元模式

来源:互联网 发布:美工与设计师的区别 编辑:程序博客网 时间:2024/06/05 15:58

应用场景:

可以避免大量非常相似类的开销,有时需要生成大量细粒度的类实例来表示数据,如果发现这些实例除了几个参数外基本上都是相同的,有时就能够大幅度减少需要实例化的类数量。如果将这些参数移到类实例外面,在方法调用时将他们传递进来,就可以通过共享大幅度减少单个实例数目。




/**
用户
**/
public class User {
public String userName;
public String passWd;


public User(String userName, String passWd) {
this.userName = userName;
this.passWd = passWd;
}
}

------------------------------------------------------------------------------------

public abstract class Website {
public String type;
    
    public Website(String type) {
super();
this.type = type;
}


    public abstract void use(User user);
}

----------------------------------------------------------------------------------------

public class ConcurrentWebSite extends Website {


public ConcurrentWebSite(String type) {
super(type);
}


@Override
public void use(User user) {
System.out.println("The web site's type is: " + type);
System.out.println("User: " + user.userName);
System.out.println("Passwd: " + user.passWd);
System.out.println();
}


}

-----------------------------------------------------------------------------------------------------

public class WebSiteFactory {
public static Map<String, Website> webSites = new HashMap<String, Website>();


private WebSiteFactory() {
}


public static Website createWebSite(String type) {
Website webSite = webSites.get(type);
if (webSite == null) {
webSite = new ConcurrentWebSite(type);
webSites.put(type, webSite);
}
return webSite;
}


public static int webSitesCount() {
return webSites.size();
}
}

---------------------------------------------------------------------------------

public class Test {


/**
* 测试类
* 这里我们共享的实例就是Website,type为内部参数,User作为外部参数传入。
*/
public static void main(String[] args) {
  Website wb1 = WebSiteFactory.createWebSite("BusinessWebSite");
       User user1 = new User("root", "root");
       wb1.use(user1);
       
       Website wb2 = WebSiteFactory.createWebSite("BusinessWebSite");
       User user2 = new User("admin", "admin");
       wb2.use(user2);
       
       Website wb3 = WebSiteFactory.createWebSite("BusinessWebSite");
       User user3 = new User("slave", "slave");
       wb3.use(user3);
       
       Website wb4 = WebSiteFactory.createWebSite("PersonalWebSite");
       User user4 = new User("person", "person");
       wb4.use(user4);
       
       Website wb5 = WebSiteFactory.createWebSite("PersonalWebSite");
       User user5 = new User("alexis", "alexis");
       wb5.use(user5);
       
       Website wb6 = WebSiteFactory.createWebSite("PersonalWebSite");
       User user6 = new User("shadow", "shadow");
       wb6.use(user6);
       
       System.out.println("WebSites Instances Count: " + WebSiteFactory.webSitesCount());
       Set<Entry<String, Website>> entrySet = WebSiteFactory.webSites.entrySet();
       for (Entry<String, Website> entry : entrySet) {
        System.out.println(entry.getValue().type);
}
}


}


0 0
原创粉丝点击