目录
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;
}
//重写方法
@Override
public 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.优缺点
- 优点:
- 大大减少了对象的创建,降低了程序内存的占用,提高效率
- 缺点:
- 提高了系统的复杂度,需要分离出内部状态和外部状态