极速理解设计模式系列:14.轻量级模式(Flyweight Pattern)

简介:

五个角色:抽象轻量级类(Flyweight)、具体轻量级类(ConcreteFlyweight)、不共享具体轻量级类(UnsharedConcreteFlyweight)、轻量级类工厂(FlyweightFactory)、客户端(Client) 

        抽象轻量级类(Flyweight):声明一个接口并且有一些属性可以设置对象的状态

        具体轻量级类(ConcreteFlyweight):实现接口,并且有相关的状态

        不共享具体轻量级类(UnsharedConcreteFlyweight):不被共享的具体轻量级类

        轻量级类工厂(FlyweightFactory):创建并且管理Flyweight对象,当客户端发出轻量级类请求时提供一个已创建或者未创建的对象

        客户端(Client) :只需要使用轻量级类工厂调用相应的轻量级类即可。

 实现思路:客户端调用轻量级类工厂,工厂去查找是否已经有轻量级类实例,如果有则直接返回给客户端,如果没有则根据条件创建相应的实例给客户端。

 类图:

应用场景:游戏中的衣服实对象有很多种,会背穿在很多人的身上。

分析:游戏中的衣服它穿在很多人的身上,如果为每个人身上的衣服设置一个实例,那么对服务器的压力将不言而喻,这时如果在衣服内部设置很多种状态属性,在客户端调用的时候,使用轻量级类工厂来创建选择即可。

        下面我们在控制台程序去演示一下如何使用Flyweight Pattern:

        一、抽象轻量级类(Flyweight)

 

 
  1. //抽象轻量级类(Flyweight) 
  2. abstract class Clothes 
  3.     public string Name { get; set; } 
  4.     public int Defense { get; set; } 
  5.     public abstract void GetDefense(); 

        二、具体轻量级类(ConcreteFlyweight)

 

 
  1. //具体轻量级类(ConcreteFlyweight) 
  2. class LowClothes : Clothes 
  3.     public LowClothes() 
  4.     { 
  5.         Name = "青铜圣衣"
  6.         Defense = 50; 
  7.     } 
  8.     public override void GetDefense() 
  9.     { 
  10.         Console.WriteLine(Name + "的防御是" + Defense); 
  11.     } 
  12.  
  13. //具体轻量级类(ConcreteFlyweight) 
  14. class MiddleClothes : Clothes 
  15.     public MiddleClothes() 
  16.     { 
  17.         Name = "白银圣衣"
  18.         Defense = 80; 
  19.     } 
  20.     public override void GetDefense() 
  21.     { 
  22.         Console.WriteLine(Name + "的防御是" + Defense); 
  23.     } 
  24.  
  25. //具体轻量级类(ConcreteFlyweight) 
  26. class HighClothes : Clothes 
  27.     public HighClothes() 
  28.     { 
  29.         Name = "黄金圣衣"
  30.         Defense = 100; 
  31.     } 
  32.     public override void GetDefense() 
  33.     { 
  34.         Console.WriteLine(Name + "的防御是" + Defense); 
  35.     } 

        三、轻量级类工厂(FlyweightFactory)

 

 
  1. //轻量级类工厂(FlyweightFactory) 
  2. class ClothesFactory 
  3.     private Hashtable clothesHT = new Hashtable(); 
  4.     public Clothes GetClothes(string clothesName) 
  5.     { 
  6.         Clothes clothes = (Clothes)clothesHT[clothesName]; 
  7.         if (clothes == null
  8.         { 
  9.             switch (clothesName) 
  10.             { 
  11.                 case "青铜圣衣": clothes = new LowClothes(); 
  12.                     break; 
  13.                 case "白银圣衣": clothes = new MiddleClothes(); 
  14.                     break; 
  15.                 case "黄金圣衣": clothes = new HighClothes(); 
  16.                     break; 
  17.             } 
  18.             clothesHT.Add(clothesName, clothes); 
  19.         } 
  20.         return clothes; 
  21.     } 

        四、客户端(Client) 

 

 
  1. //客户端(Client) 
  2. class Program 
  3.     static void Main(string[] args) 
  4.     { 
  5.         ClothesFactory fac = new ClothesFactory(); 
  6.         fac.GetClothes("黄金圣衣").GetDefense(); 
  7.         fac.GetClothes("白银圣衣").GetDefense(); 
  8.         fac.GetClothes("黄金圣衣").GetDefense(); 
  9.         fac.GetClothes("黄金圣衣").GetDefense(); 
  10.         fac.GetClothes("青铜圣衣").GetDefense(); 
  11.         fac.GetClothes("白银圣衣").GetDefense(); 
  12.         Console.ReadLine(); 
  13.     } 

        如需源码请点击 FlyWeightPattern.zip 下载。



本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/827013

相关文章
|
1月前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
22 0
|
2月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
55 0
|
3月前
|
设计模式 前端开发 JavaScript
观察者模式 vs 发布-订阅模式:两种设计模式的对决!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
29天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
9天前
|
设计模式 前端开发 Java
19:Web开发模式与MVC设计模式-Java Web
19:Web开发模式与MVC设计模式-Java Web
19 4
|
14天前
|
设计模式 消息中间件 Java
Java 设计模式:探索发布-订阅模式的原理与应用
【4月更文挑战第27天】发布-订阅模式是一种消息传递范式,被广泛用于构建松散耦合的系统。在 Java 中,这种模式允许多个对象监听和响应感兴趣的事件。
34 2
|
17天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
|
17天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
19天前
|
设计模式
设计模式(一)简单工厂模式
设计模式(一)简单工厂模式
14 0
|
27天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
16 1