c#设计模式-结构型模式-6.享元模式
Posted mr.chenyuelin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#设计模式-结构型模式-6.享元模式相关的知识,希望对你有一定的参考价值。
享元模式:共享之前创建过的对象,对象复用
看例子吧
例子,就是比如我需要20个上兵,一半是陆军,一半是海军,我们不是new20个对象,而是如果创建的是陆军的对象,如果之前创建过陆军对象,就不需要重新new了,直接从list中取就好了,遇到新的兵种时,再加到list里,然后下一次就不需要new了,重复这个过程
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 享元模式
public enum SoldierType
Normal,
Water
public abstract class Soldier
public string Name get; private set;
protected Soldier(string name)
this.Name = name;
public Weapen WeapenInstance get; set;
public abstract void Fight();
public sealed class NormalSoldier : Soldier
public NormalSoldier(string name) : base(name)
public override void Fight()
WeapenInstance.Fire("士兵:" + Name + "在陆地执行任务");
public sealed class WaterSoldier : Soldier
public WaterSoldier(string name) : base(name)
public override void Fight()
WeapenInstance.Fire("士兵:" + Name + "在海中执行任务");
public abstract class Weapen
public abstract void Fire(string jobName);
public sealed class AK47 : Weapen
public override void Fire(string jobName)
Console.WriteLine(jobName);
//核心
public sealed class SolidierFactory
private static List<Soldier> soldiers;
static SolidierFactory()
soldiers = new List<Soldier>();
Soldier mySoldier = null;
public Soldier GetSoldier(string name,Weapen weapen,SoldierType soldierType)
foreach (Soldier soldier in soldiers)
//如果当前list出现过,则无需创建对象直接返回
if (string.Compare(soldier.Name, name, true) == 0)
mySoldier = soldier;
return mySoldier;
switch (soldierType)
case SoldierType.Normal:
mySoldier = new NormalSoldier(name);
break;
case SoldierType.Water:
mySoldier = new WaterSoldier(name);
break;
mySoldier.WeapenInstance = weapen;
soldiers.Add(mySoldier);
return mySoldier;
class Program
static void Main(string[] args)
SolidierFactory solidierFactory = new SolidierFactory();
AK47 aK47 = new AK47();
for (int i = 0; i < 20; i++)
Soldier soldier = null;
if (i <= 10)
soldier = solidierFactory.GetSoldier("士兵" + (i + 1), aK47, SoldierType.Normal);
else
soldier = solidierFactory.GetSoldier("士兵" + (i + 1), aK47, SoldierType.Water);
soldier.Fight();
Console.Read();
享元模式的使用场景:
当系统中大量使用某些相同或者相似的对象,这些对象要耗费大量的内存,并且这些对象剔除外部状态后可以通过一个对象来替代,这时可以考虑使用享元模式。在软件系统中享元模式大量用于各种池技术,如数据库连接对象池,字符串缓存池,HttpApplication池等。
享元模式的优点:
通过对象的复用减少了对象的数量,节省内存。
享元模式的缺点:
需要分离对象的外部状态和内部状态,使用不当会引起线程安全问题,提高了系统的复杂度。
以上是关于c#设计模式-结构型模式-6.享元模式的主要内容,如果未能解决你的问题,请参考以下文章