常用设计模式:享元模式和门面模式

享元模式和门面模式

享元模式

定义:运用共享技术有效地支持大量细粒度的对象
既然是共享就要考虑线程安全
比如说 要种上一棵树 ,然后实现一篇森林,如果通过new对象不断创建树的话,会占用内存。那么可以通过复用的形式。

public class Tree {
	//设置不可变 保证线程安全性
	private final String name;
	private final String data;
	public Tree(String name, String data) {
		System.out.println(" name: "+name +" tree created. ");
		this.name = name;
		this.data = data;
	}
	public String getName() {
		return name;
	}
	public String getData() {
		return data;
	}
}
public class TreeNode {
	private int x;
	private int y;
	private Tree tree;
	public TreeNode(int x, int y, Tree tree) {
		this.x = x;
		this.y = y;
		this.tree = tree;
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	public Tree getTree() {
		return tree;
	}
	public void setTree(Tree tree) {
		this.tree = tree;
	}
}
public class TreeFactory {
	private static Map<String,Tree> map = new ConcurrentHashMap<>();
	//如果有这棵树直接返回,没有创建树放入map再返回
	private static Tree getTree(String name,String data){
		if (map.containsKey(name)){
			return map.get(name);
		}else{
			Tree tree = new Tree(name, data);
			map.put(name,tree);
			return tree;
		}
	}
}

测试

public class Test {
	public static void main(String[] args) {
		TreeNode node = new TreeNode(5,5,TreeFactory.getTree("xxx","dddd"));
		TreeNode node1 = new TreeNode(5,5,TreeFactory.getTree("xxx","dddd"));
		TreeNode node2 = new TreeNode(5,5,TreeFactory.getTree("yyy","dddd"));
		TreeNode node3 = new TreeNode(5,5,TreeFactory.getTree("yyy","dddd"));
	}
}

优点
如果系统有大量类似的对象,可以节省大量的内存及CPU资源

门面模式

定义:
为子系统中的一组接口提供一个一致的接口,Facade 模式定义了一个 高层接口,这个接口使得这一子系统更加容易使用
比如说有很多个子系统,如果直接调用子系统,需要学习每个子系统,那么如果在每个子系统中提取一个接口,那么只需要了解这个接口即可。

//定义多个子系统
public class SubSystem {
	public void method() {
		System.out.println( " SubSystem.method1 executed. " );
	}
}

class SubSystem1{
	public void method1() {
		System.out.println( " SubSystem1.method1 executed. " );
	}
}

class SubSystem2{
	public void method2() {
		System.out.println( " SubSystem2.method1 executed. " );
	}
}

没有使用门面模式下,客户使用子系统

public class Client {
	private SubSystem subSystem = new SubSystem();
	private SubSystem1 subSystem1 = new SubSystem1();
	private SubSystem2 subSystem2 = new SubSystem2();
	public void doSomething(){
		subSystem.method();
		subSystem1.method1();
		subSystem2.method2();
	}
}
class Client1 {
	private SubSystem subSystem = new SubSystem();
	private SubSystem1 subSystem1 = new SubSystem1();
	private SubSystem2 subSystem2 = new SubSystem2();
	public void doSomething1(){
		subSystem.method();
		subSystem1.method1();
		subSystem2.method2();
	}
}

使用门面模式

public class Facade {
	private SubSystem subSystem = new SubSystem();
	private SubSystem1 subSystem1 = new SubSystem1();
	private SubSystem2 subSystem2 = new SubSystem2();

	public void doSomethingFacade(){
		subSystem.method();
		subSystem1.method1();
		subSystem2.method2();
	}
}

客户端的使用

public class Client {
	private Facade facade = new Facade();
	public void doSomething(){
		facade.doSomethingFacade();
	}
}
class Client1 {
	private Facade facade = new Facade();
	public void doSomething1(){
		facade.doSomethingFacade();
	}
}

应用场景
1.当您需要使用复杂子系统的有限但直接的接口时,请使用Facade模 式。
2.当您想要将子系统组织成层时,请使用Facade。

优点:
简化客户端的调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值