享元模式和门面模式
享元模式
定义:运用共享技术有效地支持大量细粒度的对象
既然是共享就要考虑线程安全
比如说 要种上一棵树 ,然后实现一篇森林,如果通过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。
优点:
简化客户端的调用