目录
1.初步认识
2.状态模式
3.角色功能
4.代码实战
5.优缺点
1.初步认识
- 享元设计模式(Flyweight Pattern):属于结构型模式,主要用于减少创建对象的数量,以减少内存占用和提高性能,它提供了减少对象数量从而改善应用所需的对象结构的方式。
- 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象
2.状态模式
- 内部状态:
- 不会随环境的改变而有所不同,是可以共享的
- 外部状态:
- 不可以共享的,它随环境的改变而改变的,因此外部状态是由客户端来保持(因为环境的变化一般是由客户端引起的)
3.角色功能
- 抽象享元角色:为具体享元角色规定了必须实现的方法,而外部状态就是以参数的形式通过此方法传入
- 具体享元角色:实现抽象角色规定的方法。如果存在内部状态,就负责为内部状态提供存储空间。
- 享元工厂角色:负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键
- 客户端角色:维护对所有享元对象的引用,而且还需要存储对应的外部状态
4.代码实战
抽象类-网站方法
/*** 抽象网站** 抽象享元角色*/
public abstract class CloudWeSite {//抽象发放public abstract void run(Company company);}
实体类 -公司
/*** 公司实体*/
public class Company {private String name;public Company() {}public Company(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
具体的网站类型 -不同的网站
/*** 具体的网站* 共享内部数据* 具体享元角色*/
public class ConcreteWeSite extends CloudWeSite {//网站类型private String category;public ConcreteWeSite(String category) {this.category = category;}//重写方法@Overridepublic void run(Company company) {System.out.println("网站分类:" + category + ",公司:" + company.getName());}
}
抽象工厂-是否复用网站
/*** 享元工厂*/
public class WebSiteFactory {private Map<String, CloudWeSite> map = new Hashtable<>();/*** 根据类型获取具体的享元角色** @param category* @return*/public CloudWeSite getWebSiteByKey(String category) {//根据类型,看map中是否存在if (map.containsKey(category)) {//存在直接返回return map.get(category);} else {//不存在ConcreteWeSite concreteWeSite = new ConcreteWeSite(category);//创建完成后,先放入map中map.put(category, concreteWeSite);//在返回return concreteWeSite;}}/*** 统计数量** @return*/public int getWebSiteNum() {return map.size();}
}
实测
public class MyMain {public static void main(String[] args) {WebSiteFactory webSiteFactory=new WebSiteFactory();CloudWeSite weSite1 = webSiteFactory.getWebSiteByKey("企业官网");weSite1.run(new Company("能力有限公司"));CloudWeSite weSite2 = webSiteFactory.getWebSiteByKey("企业官网");weSite2.run(new Company("能力无限公司"));CloudWeSite weSite3 = webSiteFactory.getWebSiteByKey("校园活动");weSite3.run(new Company("小小课堂"));System.out.println("网站总数:"+webSiteFactory.getWebSiteNum());}
}
5.优缺点
- 优点:
- 大大减少了对象的创建,降低了程序内存的占用,提高效率
- 缺点:
- 提高了系统的复杂度,需要分离出内部状态和外部状态