享元模式

定义:

提供了减少对象数量从而改善应用所需的对象结构的方式,运用共享技术有效的支持大量细粒度的对象。(结构型)

适用场景:

1.常常用于系统的底层开发,以便解决系统的性能问题。
2.系统有大量的相似对象、需要缓冲池的场景。

优点:

1.减少内存的创建,降低内存中对象的数量,降低系统的内存,提高效率。
2.减少内存之外的其他资源的占用。

缺点:

1.关注内/外部状态,关注线程安全问题
2.使系统、程序的逻辑复杂化

扩展:

1.内部状态
2.外部状态

Coding

Employee :

public interface Employee {
    void report();
}

Manager:

public class Manager implements Employee{

    Manager(String department){
        this.department = department;
    }
    @Override
    public void report() {
        System.out.println(reportContent);
    }
    private String department;
    private String reportContent;

    public void setReportContent(String reportContent) {
        this.reportContent = reportContent;
    }
}

EmployeeFactory

public class EmployeeFactory {
   private final static Map EMPLOYEE_MAP = new HashMap<>();

   public static Employee getManager(String department){
       Manager manager = (Manager) EMPLOYEE_MAP.get(department);
       if(null == manager){
           manager = new Manager(department);
           System.out.print("创建部门经理:"+department);
           String reportContent=department+"部门汇报,此次报告内容为:。。。。。";
           manager.setReportContent(reportContent);
           System.out.println(" 创建报告:"+reportContent);
           System.out.println();
           EMPLOYEE_MAP.put(department,manager);
       }
       return manager;
   }
}

对象创建之后,可以直接从缓存区获取,没必要每次都重新创建。
Test:

public class Test {

    private static final String[] departments = {"RD","BD","QA","PM"};

    public static void main(String[] args) {
     for (int i= 0;i<10;i++){
         String department = departments[(int)(Math.random()*departments.length)];
         Manager manager = (Manager) EmployeeFactory.getManager(department);
         manager.report();
     }
    }
}

执行结果:

创建部门经理:QA 创建报告:QA部门汇报,此次报告内容为:。。。。。

QA部门汇报,此次报告内容为:。。。。。
创建部门经理:RD 创建报告:RD部门汇报,此次报告内容为:。。。。。

RD部门汇报,此次报告内容为:。。。。。
创建部门经理:BD 创建报告:BD部门汇报,此次报告内容为:。。。。。

BD部门汇报,此次报告内容为:。。。。。
RD部门汇报,此次报告内容为:。。。。。
创建部门经理:PM 创建报告:PM部门汇报,此次报告内容为:。。。。。

PM部门汇报,此次报告内容为:。。。。。
RD部门汇报,此次报告内容为:。。。。。
RD部门汇报,此次报告内容为:。。。。。
RD部门汇报,此次报告内容为:。。。。。
RD部门汇报,此次报告内容为:。。。。。
QA部门汇报,此次报告内容为:。。。。。

Process finished with exit code 0

UML:

享元模式_第1张图片
UML.png
享元模式_第2张图片
微信公众号欢迎关注.jpg

你可能感兴趣的:(享元模式)