【设计模式】享元(Flyweight)模式实例

系列文章目录

第五章 结构模式(下)


目录

系列文章目录

🌍前言

一、🌍外观(Facade)模式是什么?

二、🌍外观(Facade)模式的优缺点

三、🌍外观(Facade)模式的结构

四、🌍实例演示

1.🌕实例概述

2.🌕代码演示

3.🌕实验结果

总结


🌍前言

        设计模式,又称为软件设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结

        学习设计模式可以提高程序员的思维能力编程能力设计能力,使程序设计更加标准化代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期


提示:以下是本篇文章正文内容,下面案例可供参考

一、🌍享元(Flyweight)模式是什么?

        运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来提高系统资源的利用率。

二、🌍享元(Flyweight)模式的优缺点🌍

       优点:

1)相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力

       缺点:

1)为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性

2)读取享元模式的外部状态会使得运行时间稍微变长

三、🌍享元(Flyweight)模式的结构🌍

         

  

1)抽象享元(Flyweight)角色:是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。

2)具体享元(ConcreteFlyweight)角色:实现抽象享元角色中所规定的接口。

3)非享元(UnsharableFlyweight)角色:是不可以共享的外部状态,它以参数的形式注入到具体享元的相关方法中。

4)享元工厂(FlyweightFactoiy)角色:负责创建和管理享元角色。

   

四、🌍实例演示🌍

1.🌕实例概述🌕

抽象享元角色:Soccer类(足球)

具体享元角色:Gym类(体育馆)

非享元角色:本文将非享元角色类合并在具体享元角色中(例如:变量sport,price)

享元工厂角色:SoccerFactory类,负责创建和管理享元角色。

2.🌕代码演示🌕

package Flyweight;

import java.util.ArrayList;
import java.util.HashMap;

public class Sportgame {

	private static final ArrayList<String> Consumption_msg = new ArrayList<String>();

	private static void addmsg(String msg) {
		Consumption_msg.add(msg);
	}

	public static void main(String[] args) {
		addmsg("重庆体育馆");
		addmsg("上海体育馆");
		addmsg("北京体育馆");
		addmsg("重庆体育馆");
		addmsg("重庆体育馆");
		addmsg("北京体育馆");
		addmsg("上海体育馆");
		addmsg("重庆体育馆");
		addmsg("北京体育馆");

		for (String e : Consumption_msg) {
			SoccerFactory.getSoccer(e).display();
		}
	}

}


//享元工厂
class SoccerFactory{
	private static HashMap<String,Gym> e = new HashMap<String,Gym>();
	
	public static Gym getSoccer(String gymName) {
		Gym gym = e.get(gymName);
		
		if(gym == null) {
			gym = new Gym(gymName);
			e.put(gymName, gym);
		}

		return gym;
		
	}
	
}

//具体享元
class Gym implements Soccer{
	String gymName;
	String sport = "足球";
	double price = 500;
	
	public Gym(String gymName) {
		this.gymName = gymName;
	}

	public void setSport(String sport) {
		this.sport = sport;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("{In[" + gymName + "],[Progect:" + sport + "],[Price:" + price
				+ "]["+this+"]}");
	}
	
	
}
//抽象享元
interface Soccer{
	public void display();
}

3.🌕实验结果🌕

{In[重庆体育馆],[Progect:足球],[Price:500.0][Flyweight.Gym@5d22bbb7]}
{In[上海体育馆],[Progect:足球],[Price:500.0][Flyweight.Gym@3830f1c0]}
{In[北京体育馆],[Progect:足球],[Price:500.0][Flyweight.Gym@39ed3c8d]}
{In[重庆体育馆],[Progect:足球],[Price:500.0][Flyweight.Gym@5d22bbb7]}
{In[重庆体育馆],[Progect:足球],[Price:500.0][Flyweight.Gym@5d22bbb7]}
{In[北京体育馆],[Progect:足球],[Price:500.0][Flyweight.Gym@39ed3c8d]}
{In[上海体育馆],[Progect:足球],[Price:500.0][Flyweight.Gym@3830f1c0]}
{In[重庆体育馆],[Progect:足球],[Price:500.0][Flyweight.Gym@5d22bbb7]}
{In[北京体育馆],[Progect:足球],[Price:500.0][Flyweight.Gym@39ed3c8d]}


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了结构模式下享元模式的定义,优缺点以及其的模式结构,并通过实例演示,进一步反应了在一定需求条件下,享元模式的优点和适用性。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值