【设计模式】——享元模式

【享元模式】

 

享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象,减少创建对象的数量以减少内存的占用和提高性能,提供了减少对象数量从而改善应用所需要的对象结构的方式

 

【介绍】

 

  • 如何解决:用唯一标识码判断,如果在内存中又,则返回这个唯一标识码所标识的对象

  • 关键代码:用MashMap存储这些对象

  • 优点:大大减少了对象的创建,降低系统的内存,提高效率

  • 缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不随着内部状态的变化而变化,否则则会造成系统的混乱

  • 注意事项:注意划分外部状态和内部状态,否则会氢气线程安全问题;这些类必须有一个工厂对象加以控制

 

 

【实现】

 

【设计模式】——享元模式_第1张图片

 

【设计模式】——享元模式_第2张图片

 

 

步骤一:外部状态对象:用户


 

public class  User

    {

        private string name;

        public User(string name)

        {

            this.name = name;

        }

        public string Name

        {

            get { return name; }

        }

    }

步骤二:flayweight类:网站类


 

 abstract class WebSite

    {

        public abstract void Use(User user);//方法需要传递用户对象

    }

 

步骤三:concreteFlyweight类:具体网站类


 

 class ConcreteWebSit:WebSite

    {

        private string name = "";

        public ConcreteWebSit (string name)

        {

            this.name = name;

        }

        public override void Use(User user)

        {

            Console.WriteLine("网站分类:"+name+"    用户:"+user .Name );

        }

    }

步骤四:flyweightfactory类:网站工厂类


 

class WebSiteFactory

    {

        private Hashtable flyweights = new Hashtable();

        //获得网站分类

        public WebSite GetWebSiteCategory(string key)

        {

            if (!flyweights.ContainsKey(key))

                flyweights.Add(key, new ConcreteWebSit(key));

            return ((WebSite)flyweights[key]);

        }



        //获得网站总数

        public int GetWebSiteCount()

        {

            return flyweights.Count;

        }

    }

步骤五:客户端代码


 

class Program

    {

        static void Main(string[] args)

        {

            WebSiteFactory f = new WebSiteFactory();



            WebSite fx = f.GetWebSiteCategory("产品展示");

            fx.Use(new User("皮皮华"));

            Console.WriteLine("");



            WebSite fx1 = f.GetWebSiteCategory("产品展示");

            fx1.Use(new User("皮皮杰"));

            Console.WriteLine("");

            WebSite fx2 = f.GetWebSiteCategory("产品展示");

            fx2.Use(new User("皮皮军"));

            Console.WriteLine("");



            WebSite f1= f.GetWebSiteCategory("博客");

            f1.Use(new User("皮皮鬼"));

            Console.WriteLine("");



            WebSite f2 = f.GetWebSiteCategory("博客");

            f2.Use(new User("皮皮人"));

            Console.WriteLine("");



            WebSite f3= f.GetWebSiteCategory("博客");

            f3.Use(new User("皮皮神"));

            Console.WriteLine("");



            Console.WriteLine("得到网站总数为:{0}",f.GetWebSiteCount ());

            Console.Read();

        }

    }

 

步骤五:运行结果

网站分类:产品展示    用户:皮皮华



网站分类:产品展示    用户:皮皮杰



网站分类:产品展示    用户:皮皮军



网站分类:博客    用户:皮皮鬼



网站分类:博客    用户:皮皮人



网站分类:博客    用户:皮皮神



得到网站总数为:2

 

 

 

【总结】

 

一、在享元对象内部并且不会随着环境改变而改变的共享部分,称为是享元对象的内部状态,随着环境的改变而改变的,不可以共享的状态就是外部状态

二、享元模式可以避免大量非常相似类的开销。

三、如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时,就应该考虑使用,对象的大多数状态可以外部状态。如果删除对象的外部状态,那么可以用相对较少的共享对象取代很对组对象

 

 

 

你可能感兴趣的:(【设计模式】,设计模式)