系列文章目录
第五章 结构模式(下)
目录
🌍前言
设计模式,又称为软件设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
学习设计模式可以提高程序员的思维能力、编程能力和设计能力,使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
提示:以下是本篇文章正文内容,下面案例可供参考
一、🌍享元(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]}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了结构模式下享元模式的定义,优缺点以及其的模式结构,并通过实例演示,进一步反应了在一定需求条件下,享元模式的优点和适用性。