亨元模式从最初代码的一步步实现

网站类
public class WebSite{
	private String name="";
	public WebSite(String name)
	{
		this.name=name;
	}
	public void Use()
	{
		System.out.println("网站分类:"+name);
	}
}
客户端代码
public class Program{
	public static void main(String[] args){
		WebSite fx = new WebSite("产品展示"); fx.Use();
		WebSite fy = new WebSite("产品展示"); fy.Use();
		WebSite fz = new WebSite("产品展示"); fz.Use();
		WebSite fl = new WebSite("博客"); fl.Use();
		WebSite fm = new WebSite("博客"); fm.Use();
		WebSite fn = new WebSite("博客"); fn.Use();
	}
}

public abstract class Flyweight{
	public String intrinsic;//内部状态
	protected final String extrinsic;//外部状态
	//要求享元角色必须接受外部状态
	public Flyweight(String extrinsic){
		this.extrinsic = extrinsic;
	}
	public abstract void operate(int extrinsic);//定义业务操作
	public String getIntrinsic(){
		return intrinsic;
	}
	public void setIntrinsic(String intrinsic){
		this.intrinsic = intrinsic;
	}
}

//ConcreteFlyweight继承Flyweight超类或实现Flyweight接口,并为内部状态增加存储空间。
public class CincreteFlyweight extends Flyweight{
//接受外部状态
	public ConcreteFlyweight(String extrinsic){
		super(extrinsic);
	}
	//根据外部状态进行逻辑处理
	public void operate(int extrinsic){
		System.out.println("具体Flyweight:"+extrinsic);
	}
}

//UnsharedConcreteFlyweight是指那些不需要共享的Flyweight子类。因为Flyweight接口使共享成为可能,但它并不强制共享。
public class UnsharedConcreteFlyweight extends Flyweight{
	public UnsharedConcreteFlyweight(String extrinsic){
		super(extrinsic);
	}
	public void operate(int extrinsic){
		System.out.println("不共享的具体Flyweight:"+extrinsic);
	}
}

//FlyweightFactory,是一个享元工厂,用来创建并管理Flyweight对象。它主要用来确保合理地共享Flyweight。当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。
import java.util.HashMap;
public class FlyweightFactory{
	//定义一个池容器
	private static HashMap<String,Flyweight>pool = new HashMap<String,Flyweight>();
	//享元工厂
	public static Flyweight getFlyweight(String extrinsic){
		Flyweight flyweight = null;
		if(pool.containsKey(extrinsic)){//池中有该对象
			flyweight = pool.get(extrinsic);
			System.out.print("已有"+extrinsic+"直接从池中取--->");
		}else{ //根据外部状态创建享元对象
			flyweight = new ConcreteFlyweight(extrinsic);
			pool.put(extrinsic,flyweight);//放入池中
			System.out.print("创建"+extrinsic+"并从池中取出--->");
		}
		return flyweight;
	}
}

//客户端代码
public class Client{
	public static void main(String[] args){
		int extrinsic = 22;
		FlyweightFactory f = new FlyweightFactory();
		Flyweight flyweightX = f.getFlyweight("X");
		flyweightX.operate(--extrinsic);
		Flyweight flyweightY = f.getFlyweight("Y");
		flyweightY.operate(--extrinsic);
		Flyweight flyweightZ = f.getFlyweight("Z");
		flyweightZ.operate(--extrinsic);
		Flyweight flyweightReX = f.getFlyweight("X");
		flyweightReX.operate(--extrinsic);
		Flyweight unsharedFlyweight = new UnsharedConcreteFlyweight("X");
		unsharedFlyweight.operate(--extrinsic);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值