From 96a94fc3322c1f552e55b6c86764cccb4e2e44f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Sun, 14 Oct 2018 16:29:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=AB=E5=85=83=E6=A8=A1=E5=BC=8F=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../structural/flyweight/Employee.java | 11 +++++++ .../structural/flyweight/EmployeeFactory.java | 31 +++++++++++++++++ .../pattern/structural/flyweight/Manager.java | 33 +++++++++++++++++++ .../structural/flyweight/EmployeeTest.java | 17 ++++++++++ 4 files changed, 92 insertions(+) create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/structural/flyweight/Employee.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/structural/flyweight/EmployeeFactory.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/structural/flyweight/Manager.java create mode 100644 src/test/java/top/fjy8018/designpattern/pattern/structural/flyweight/EmployeeTest.java diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/flyweight/Employee.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/flyweight/Employee.java new file mode 100644 index 0000000..7627160 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/flyweight/Employee.java @@ -0,0 +1,11 @@ +package top.fjy8018.designpattern.pattern.structural.flyweight; + +/** + * 享元模式:利用共享的方式来支持大量细粒度的对象,这些对象一部分内部状态是相同的。 + * + * @author F嘉阳 + * @date 2018-10-14 16:13 + */ +public interface Employee { + void report(); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/flyweight/EmployeeFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/flyweight/EmployeeFactory.java new file mode 100644 index 0000000..4a82d6a --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/flyweight/EmployeeFactory.java @@ -0,0 +1,31 @@ +package top.fjy8018.designpattern.pattern.structural.flyweight; + +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 员工工厂类 + * + * @author F嘉阳 + * @date 2018-10-14 16:15 + */ +@Slf4j +public class EmployeeFactory { + private static final Map EMPLOYEE_MAP = new ConcurrentHashMap<>(); + + public static Employee getEmployee(String department) { + Manager manager = (Manager) EMPLOYEE_MAP.get(department); + // 如果在对象池中不存在,则新建对象 + if (manager == null) { + manager = new Manager(department); + log.warn("创建{}部门经理", department); + String content = "报告内容……"; + log.warn("创建报告,内容为:{}", content); + manager.setContent(content); + EMPLOYEE_MAP.put(department, manager); + } + return manager; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/flyweight/Manager.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/flyweight/Manager.java new file mode 100644 index 0000000..bcee8c8 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/flyweight/Manager.java @@ -0,0 +1,33 @@ +package top.fjy8018.designpattern.pattern.structural.flyweight; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author F嘉阳 + * @date 2018-10-14 16:16 + */ +@Slf4j +public class Manager implements Employee { + + private String content; + + private String department; + + /** + * 内部状态 + */ + private String title = "部门经理"; + + public Manager(String department) { + this.department = department; + } + + public void setContent(String content) { + this.content = content; + } + + @Override + public void report() { + log.info("{}{},汇报内容:{}", department, title, content); + } +} diff --git a/src/test/java/top/fjy8018/designpattern/pattern/structural/flyweight/EmployeeTest.java b/src/test/java/top/fjy8018/designpattern/pattern/structural/flyweight/EmployeeTest.java new file mode 100644 index 0000000..59b5f72 --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/structural/flyweight/EmployeeTest.java @@ -0,0 +1,17 @@ +package top.fjy8018.designpattern.pattern.structural.flyweight; + +import org.junit.jupiter.api.Test; + +class EmployeeTest { + + private static final String departments[] = {"RD", "QA", "PM", "BD"}; + + @Test + void report() { + for (int i = 0; i < 10; i++) { + String department = departments[(int) (Math.random() * departments.length)]; + Employee employee = EmployeeFactory.getEmployee(department); + employee.report(); + } + } +} \ No newline at end of file