设计模式之享元模式

        享元模式:运用共享技术有效的支持大量细粒度的对象。

        挺绕的一句话。

        当我们在刷微博的时候,也有很多人同时在使用。系统是一样的系统,不同的用户登录上去就有不同的微博等级,页面风格,每个人都有不同的好友,能收到不同的私信。将这个例子抽象一点来说,系统是共享的,每个用户使用的系统都是一样的,而不同的用户登录上去有不同的页面风格和等级。用户可以看做是细粒度的对象,共享的系统支持用户这样的细粒度对象,整个结构就可以理解为享元模式。

抽象享元角色:

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

	public abstract void showUserInfo(User user);
}
具体享元角色:

public class CocreteWebsite extends Website {

	public CocreteWebsite(String name) {
		super(name);
	}

	public void showUserInfo(User user) {
		System.out.print(user.name + "已登录" + this.name);
		System.out.print("\t等级:" + user.lv);
		System.out.println("\t页面风格:" + user.style);
	}

}
享元工厂角色:

public class WebsiteFactory {
	public HashMap<String, Website> websites = new HashMap<String, Website>();
	public Website getWebsite(String website) {
		if(websites.containsKey(website)) {
			return websites.get(website);
		}
		websites.put(website, new CocreteWebsite(website));
		return websites.get(website);
	}

}

用户角色:

public class User {
	public String name;
	public String style;
	public String lv;
	public User(String name, String style, String lv) {
		this.name = name;
		this.style = style;
		this.lv = lv;
	}
}

用户登录网站:

public static void main(String[] args) {
		WebsiteFactory websiteFactory = new WebsiteFactory();
		Website weibo = websiteFactory.getWebsite("微博");
		User tom = new User("Tom", "blue style", "8");
		weibo.showUserInfo(tom);
		User jim = new User("Jim Green", "pink style", "3");
		weibo.showUserInfo(jim);
		Website boke = websiteFactory.getWebsite("博客");
		boke.showUserInfo(tom);
		boke.showUserInfo(jim);
	}
输出:

Tom已登录微博 等级:8 页面风格:blue style

Jim Green已登录微博 等级:3 页面风格:pink style

Tom已登录博客 等级:8 页面风格:blue style

Jim Green已登录博客 等级:3 页面风格:pink style


        两个用户登录了两个网站,而实际上每个网站都只有一个实例,这就是享元模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值