<h2 id="1定义">1.定义
享元模式就是:运用共享技术有效地支持大量细粒度的对象。
<h2 id="2适用场景">2.适用场景
- 如果一个程序使用了大量的对象,而大量的这些对象造成了很大的开销时就应该考虑使用。
- 对象的大多数状态是外部状态,如果删除对象的外部状态,就可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。
- 享元模式通常用于底层设计。

<h2 id="4劣势">4.劣势
- 使用享元模式需要维护一个记录了系统已有的所有享元的列表。
- 享元模式使得系统更加复杂。
- 为了使得对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。
- 场景:根据用户登录网站的类型,创建网站实例,从而同一类型的网站只存在一个实例。
- UML图:

- 代码结构图:

-
代码: code1
package designmodel.chapter26;
/**
* @Author: cxh
* @CreateTime: 18/2/21 11:52
* @ProjectName: JavaBaseTest
*/
public class ConcreteWebSite extends WebSite {
public ConcreteWebSite(String webType) {
super.webType = webType;
}
@Override
public void display(User user) {
System.out.println("网站分类:"+super.webType+" && 登陆用户为:"+user.getName());
}
}
code2
package designmodel.chapter26;
/**
-
@Author: cxh
-
@CreateTime: 18/2/21 12:09
-
@ProjectName: JavaBaseTest
*/
public class Main {
public static void main(String[] args) {
WebSiteFactory factory=new WebSiteFactory();
ConcreteWebSite web1=factory.getWebSite("产品展示");
web1.display(new User("李丽"));
ConcreteWebSite web2=factory.getWebSite("合作商家");
web2.display(new User("周青"));
ConcreteWebSite web3=factory.getWebSite("经销商信息");
web3.display(new User("黎洲"));
ConcreteWebSite web4=factory.getWebSite("合作商家");
web4.display(new User("李丽莉"));
}
}
code3
package designmodel.chapter26;
/**
-
@Author: cxh
-
@CreateTime: 18/2/21 11:45
-
@ProjectName: JavaBaseTest
*/
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
code4
package designmodel.chapter26;
/**
- @Author: cxh
- @CreateTime: 18/2/21 11:51
- @ProjectName: JavaBaseTest
*/
public abstract class WebSite {
String webType;
public abstract void display(User user);
}
code5
package designmodel.chapter26;
import java.util.HashMap;
/**
- @Author: cxh
- @CreateTime: 18/2/21 12:01
- @ProjectName: JavaBaseTest
*/
public class WebSiteFactory {
private HashMap<String,ConcreteWebSite> map=new HashMap<>();
public ConcreteWebSite getWebSite(String type){
if(!map.containsKey(type)){
map.put(type,new ConcreteWebSite(type));
}
//输出当前网站类型的实例个数
System.out.println("当前map大小:"+map.size());
return map.get(type);
}
}
参考书籍:《大话设计模式》-程杰
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|