享元模式的两个状态:html
/** * 享元对象接口 */ public interface Flyweight { void operation(String extrinsicState); } /** * 享元对象工厂类,享元类 */ public final class FlyweightFactory { /** * 享元类容器 */ private static Map<String, Flyweight> flyweights = new HashMap<>(); public static Flyweight getFlyweight (String key) { if (flyweights.containsKey(key)) { return flyweights.get(key); } else { Flyweight flyweight = new ConcreteFlyweight(key); flyweights.put(key, flyweight); return flyweight; } } public static int size () { return flyweights.size(); } } /** * 能够被共享的对象 */ public class ConcreteFlyweight implements Flyweight{ private String intrinsicState; public ConcreteFlyweight(String intrinsicState) { this.intrinsicState = intrinsicState; } @Override public void operation(String extrinsicState) { System.out.println(this.intrinsicState); System.out.println(extrinsicState); } } /** * 不被共享的对象 */ public class UnsharedConcreteFlyweight implements Flyweight { private String allState; public UnsharedConcreteFlyweight(String allState) { this.allState = allState; } @Override public void operation(String extrinsicState) { System.out.println(this.allState); System.out.println(extrinsicState); } }
/** * 应用与测试 */ public class Test { public static void main(String[] args) { Stream.of("1", "1", "2", "2", "3").forEach(key -> { Flyweight flyweight = FlyweightFactory.getFlyweight(key); flyweight.operation("测试" + key); }); System.out.println("size: " + FlyweightFactory.size()); } }
1---:测试1 1---:测试1 2---:测试2 2---:测试2 3---:测试3 size: 3
享元模式角色介绍java
Flyweight
: 抽象享元类。全部具体享元类的超类或者接口,经过这个接口,Flyweight能够接受并做用于外部专题。ConcreteFlyweight
: 具体享元类。指定内部状态,为内部状态增长存储空间。UnsharedConcreteFlyweight
: 非共享具体享元类。指出那些不须要共享的Flyweight子类。FlyweightFactory
: 享元工厂类。用来建立并管理Flyweight对象,它主要用来确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory就会提供一个已经建立的Flyweight对象或者新建一个(若是不存在)。假设一个公司中的每一个部门的部门经理都要进行汇报不止一次
/** * 员工接口 */ public interface Employee { void report(); } /** * 员工工厂 */ public class EmployeeFactory { private static final Map<String, Employee> EMPLOYEE_MAP = new HashMap<>(); public static Employee getManager(String department) { Manager manager = (Manager) EMPLOYEE_MAP.get(department); if (manager == null) { manager = new Manager(department); System.out.println("建立部门经理:" + department); String reportContent = department + "部门汇报:这次报告内容是。。。"; manager.setReportContent(reportContent); System.out.println("建立报告: " + reportContent); EMPLOYEE_MAP.put(department, manager); } return manager; } } /** * 部门经理 */ public class Manager implements Employee { /** * 内部状态 */ private String title = "部门经理"; /** * 外部状态,须要在应用层引入,就是外部状态 */ private String department; private String reportContent; public Manager(String department) { this.department = department; } public void setReportContent(String reportContent) { this.reportContent = reportContent; } @Override public void report() { System.out.println(reportContent); } }
/** * 测试与应用 */ public class Test { private static final String[] departments = {"RD", "QA", "PM", "BD"}; /** * 要注意线程安全的问题 */ 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(); } System.out.println(EmployeeFactory.size()); } }
建立部门经理:BD 建立报告: BD部门汇报:这次报告内容是。。。 BD部门汇报:这次报告内容是。。。 建立部门经理:PM 建立报告: PM部门汇报:这次报告内容是。。。 PM部门汇报:这次报告内容是。。。 建立部门经理:QA 建立报告: QA部门汇报:这次报告内容是。。。 QA部门汇报:这次报告内容是。。。 QA部门汇报:这次报告内容是。。。 QA部门汇报:这次报告内容是。。。 BD部门汇报:这次报告内容是。。。 PM部门汇报:这次报告内容是。。。 建立部门经理:RD 建立报告: RD部门汇报:这次报告内容是。。。 RD部门汇报:这次报告内容是。。。 PM部门汇报:这次报告内容是。。。 PM部门汇报:这次报告内容是。。。 4
慕课网设计模式精讲
: https://coding.imooc.com/class/270.html 设计模式读书笔记----享元模式
: https://www.cnblogs.com/chenssy/p/3330555.html