欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 设计模式-享元模式

设计模式-享元模式

2025/2/23 0:57:03 来源:https://blog.csdn.net/dfdg345/article/details/142027338  浏览:    关键词:设计模式-享元模式

目录

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.优缺点

  • 优点:
    • 大大减少了对象的创建,降低了程序内存的占用,提高效率
  • 缺点: 
    • 提高了系统的复杂度,需要分离出内部状态和外部状态

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词