享元格局通过共享技术达成均等或一般对象的选定,享元情势通过共享技术达成均等或貌似对象的重用

情势动机
澳门威尼斯人网址 1
澳门威尼斯人网址 2

方式动机
澳门威尼斯人网址 3
澳门威尼斯人网址 4

享元方式:
  享元方式(Flyweight
Pattern):运用共享技术可行地支持大气细粒度对象的复用。系统只利用少量的指标,而这么些指标都很一般,状态变化一点都不大,能够达成指标的往往复用。由于享元方式供给能够共享的靶子必须是细粒度对象,由此它又称之为轻量级方式,它是一种对象结构型格局。

面向对象技术能够很好地化解一些随声附和或可增添性难题,但在诸多气象下须要在系统中扩张类和对象的个数。当目的数量太多时,将促成运维代价过高,带来性能下降等难题。
享元方式正是为化解这一类题材而诞生的。享元格局通过共享技术达成平等或一般对象的选定。
澳门威尼斯人网址 5

面向对象技术能够很好地消除一些随声附和或可扩张性难点,但在很多动静下要求在系统中增添类和目的的个数。当对象数量太多时,将促成运转代价过高,带来质量降低等难题。
享元方式正是为解决这一类标题而诞生的。享元情势通过共享技术完结平等或貌似对象的选定。
澳门威尼斯人网址 6

方式动机:
  面向对象技术可以很好地化解一些回船转舵或可扩大性难点,但在广大境况下要求在系统中扩张类和对象的个数。当指标数量太多时,将招致运维代价过高,带来品质下落等题材。
  享元格局就是为缓解这一类难点而诞生的。享元情势通过共享技术达成均等或貌似对象的重用。
  在享元情势中得以共享的平等内容称为内部情状(IntrinsicState),而那个急需外部环境来设置的无法共享的剧情称为外部状态(Extrinsic
State),由于区分了内部景观和外部状态,因而能够通过安装分歧的外表状态使得一样的目的能够拥有部分例外的特征,而同样的内部景色是足以共享的。
  在享元方式中见惯司空会现身工厂方式,供给创建四个享元工厂来顶住维护贰个享元池(Flyweight
Pool)用于存储具有同样之中景观的享元对象。
  在享元情势中国共产党享的是享元对象的在那之中景观,外部状态必要经过环境来设置。在骨子里运用中,能够共享的里边景色是个别的,因而享元对象一般都布署为较小的对象,它所含有的中间景观较少,那种对象也号称细粒度对象。享元情势的指标便是利用共享技术来实现大气细粒度对象的复用。

在享元方式中得以共享的均等内容称为内部景观(Intrinsic
State),而那多少个必要外部环境来安装的不能够共享的剧情称为外部状态(Extrinsic
State),由于区分了里面意况和外部状态,由此得以因而设置不一样的外表状态使得同一的指标足以有所局地不比的特色,而平等的里边景况是能够共享的。
在享元方式中一般会并发工厂情势,须求创制二个享元工厂来负担掩护一个享元池(Flyweight
Pool)用于存款和储蓄具有同等之中处境的享元对象。
在享元方式中国共产党享的是享元对象的里边情形,外部状态必要经过环境来设置。在其实使用中,能够共享的在那之中景象是简单的,因而享元对象一般都统一筹划为较小的对象,它所蕴涵的内部景观较少,那种对象也叫做细粒度对象。享元方式的目标就是采纳共享技术来落到实处大气细粒度对象的复用。

在享元情势中得以共享的同样内容称为内部境况(Intrinsic
State),而那个必要外部环境来设置的不能够共享的情节称为外部状态(Extrinsic
State),由于区分了中间景色和表面状态,因而能够透过安装分化的外表状态使得一样的靶子能够具备部分不一致的特点,而平等的中间景观是可以共享的。
在享元情势中国和东瀛常会油不过生工厂情势,必要成立叁个享元工厂来负责维护二个享元池(Flyweight
Pool)用于存款和储蓄具有相同之中情况的享元对象。
在享元形式中共享的是享元对象的其中情形,外部状态须求经过环境来安装。在骨子里运用中,能够共享的内部情状是个别的,因而享元对象一般都陈设为较小的靶子,它所蕴藏的里边情形较少,那种对象也号称细粒度对象。享元格局的指标正是利用共享技术来完结大气细粒度对象的复用。

要害剧中人物:
  抽象享元(Flyweight)剧中人物:此剧中人物是享有的切切实实享元类的超类,为那些类规定出供给达成的公共接口。那3个要求外蕴状态的操作能够由此调用商业以参数格局传播
  具体享元(ConcreteFlyweight)剧中人物:完毕Flyweight接口,并为内部景观(假诺部分话)拉回存款和储蓄空间。ConcreteFlyweight对象必须是可共享的。它所蕴藏的情况必须是里面包车型大巴
  不共享的切实享元(UnsharedConcreteFlyweight)剧中人物:并非全数的Flyweight子类都亟待被共享。Flyweigth使共享成为或许,但它并不强制共享。
  享元工厂(FlyweightFactory)剧中人物:负责创造和管理享元剧中人物。本剧中人物必须保证享元对象恐怕被系统适当地共享
  客户端(Client)角色:本角色要求保障2个对持有享元对象的引用。本剧中人物必要活动存款和储蓄全部享元对象的表面状态

形式定义
享元格局(Flyweight
Pattern):运用共享技术可行地帮助大气细粒度对象的复用。系统只利用少量的指标,而这几个指标都很一般,状态变化极小,能够达成目的的累累复用。由于享元格局须求能够共享的靶子必须是细粒度对象,因而它又称为轻量级形式,它是一种对象结构型情势。
Flyweight Pattern: Use sharing to support large numbers of fine-grained
objects efficiently.
Frequency of use: low
UML图
澳门威尼斯人网址 7

方式定义
享元方式(Flyweight
Pattern):运用共享技术可行地支撑大气细粒度对象的复用。系统只行使少量的靶子,而这一个指标都很相似,状态变化非常的小,能够完结指标的再三复用。由于享元形式须求能够共享的对象必须是细粒度对象,因而它又叫做轻量级格局,它是一种对象结构型方式。
Flyweight Pattern: Use sharing to support large numbers of fine-grained
objects efficiently.
Frequency of use: low
UML图
澳门威尼斯人网址 8

UML图:

方式结构
享元情势涵盖如下角色:
Flyweight: 抽象享元类
ConcreteFlyweight: 具体享元类
UnsharedConcreteFlyweight: 非共享具体享元类
FlyweightFactory: 享元工厂类

格局结构
享元形式涵盖如下剧中人物:
Flyweight: 抽象享元类
ConcreteFlyweight: 具体享元类
UnsharedConcreteFlyweight: 非共享具体享元类
FlyweightFactory: 享元工厂类

  澳门威尼斯人网址 9

情势分析
享元方式是一个设想系统特性的设计情势,通过采纳享元情势能够节约内部存款和储蓄器空间,进步系统的品质。
澳门威尼斯人网址 10

情势分析
享元形式是三个考虑系统性格的设计情势,通过使用享元格局能够节约内存空间,升高系统的品质。
澳门威尼斯人网址 11

 

享元情势的骨干在于享元工厂类,享元工厂类的功能在于提供一个用来存款和储蓄享元对象的享元池,用户需求对象时,首先从享元池中赢得,要是享元池中不存在,则创立1个新的享元对象回来给用户,并在享元池中保存该新增对象。

享元方式的为主在于享元工厂类,享元工厂类的职能在于提供三个用于存款和储蓄享元对象的享元池,用户要求对象时,首先从享元池中获取,如若享元池中不存在,则成立一个新的享元对象回来给用户,并在享元池中保存该新增对象。

代码实现:

享元方式以共享的法门相当慢地协理大气的细粒度对象,享元对象能成功共享的严重性是分别内部处境(Internal
State)和外部状态(External State)。
(1)
内部情状是储存在享元对象内部并且不会随环境改变而改变的场地,由此内部景观能够共享。
(2)
外部状态是随环境改观而变更的、不可能共享的事态。享元对象的外部状态必须由客户端保存,并在享元对象被创立之后,在须求利用的时候再扩散到享元对象内部。三个外部状态与另1个外部状态之间是相互独立的。

享元形式以共享的法门飞快地支撑大气的细粒度对象,享元对象能做到共享的最主若是分别内部景况(Internal
State)和外部状态(External State)。
(1)
内部景观是储存在享元对象内部并且不会随环境改观而更改的地方,因而内部处境能够共享。
(2)
外部状态是随环境改变而改变的、不得以共享的情事。享元对象的外部状态必须由客户端保存,并在享元对象被成立之后,在急需运用的时候再传播到享元对象内部。三个外表状态与另八个外部状态之间是互相独立的。

//代码实现:
header("Content-type:text/html;Charset=utf-8");

//抽象享元角色
interface Flyweight{
     function show();
}
//共享的具体享元角色
class ConcreteFlyweight implements Flyweight{
    private $state;
    function __construct($state){
        $this->state = $state;
    }
    function show(){
        return $this->state;
    }
}
//不共享的具体享元角色,客户端直接调用
class UnsharedConcreteFlyweight implements Flyweight{
    private $state;
    function __construct($state){
        $this->state = $state;
    }
    function show(){
        return $this->state;
    }
}
//享元工厂模式
class FlyweightFactory{
    private $flyweights = array();
    function getFlyweight($state){
        if(!isset($this->flyweights[$state])){
            $this->flyweights[$state]=new ConcreteFlyweight($state);
        }
        return $this->flyweights[$state];
    }
}

//测试
$flyweightFactory = new FlyweightFactory();
$flyweightOne = $flyweightFactory->getFlyweight("state A");
echo $flyweightOne->show();
$flyweightTwo = new UnsharedConcreteFlyweight("state B");
echo $flyweightTwo->show();
/*
state A
state B
*/

格局实例与分析
网站共享代码
系统布局
澳门威尼斯人网址 12

形式实例与分析
网站共享代码
系统布局
澳门威尼斯人网址 13

 

Flyweight: 抽象享元类 WebSite.cs

Flyweight: 抽象享元类 WebSite.cs

格局分析:
  享元格局是三个设想系统性格的设计情势,通过选拔享元格局能够节约内部存款和储蓄器空间,进步系统的品质。
  享元形式的中心在于享元工厂类,享元工厂类的作用在于提供四个用以存款和储蓄享元对象的享元池,用户供给对象时,首先从享元池中赢得,假设享元池中不设有,则创建1个新的享元对象回来给用户,并在享元池中保存该新增对象。
  享元形式以共享的格局火速地扶助大气的细粒度对象,享元对象能一气浑成共享的首假诺分别内部意况(Internal
State)和表面状态(External State)。
  内部景色是储存在享元对象内部并且不会随环境改变而变更的景色,因而内部景观能够共享。
  外部状态是随环境改观而更改的、不得以共享的状态。享元对象的表面状态必须由客户端保存,并在享元对象被创造之后,在须要选拔的时候再盛传到享元对象内部。三个表面状态与另一个外表状态之间是互相独立的。

namespace FlyweightPattern
{
    // 网站抽象类
    abstract class WebSite
    {
        public abstract void User(User user);
    }
}
namespace FlyweightPattern
{
    // 网站抽象类
    abstract class WebSite
    {
        public abstract void User(User user);
    }
}

优点
  享元情势的优点在于它能够非常的大减弱内部存款和储蓄器中对象的数额,使得一样对象或一般对象在内部存款和储蓄器中只保留一份。
  享元格局的外表状态绝对独立,而且不会潜移默化其里面情形,从而使得享元对象足以在不相同的环境中被共享。

User.cs

User.cs

缺点
  享元方式使得系统越来越复杂,要求分离出在那之中景况和外部状态,那使得程序的逻辑复杂化。
  为了使对象足以共享,享元情势供给将享元对象的情状外部化,而读取外部状态使得运维时刻变长。

namespace FlyweightPattern
{
    public class User
    {
        private string name;
        public User(string name)
        {
            this.name = name;
        }
        public string Name
        {
            get { return name; }
        }
    }
}
namespace FlyweightPattern
{
    public class User
    {
        private string name;
        public User(string name)
        {
            this.name = name;
        }
        public string Name
        {
            get { return name; }
        }
    }
}

在以下情况下能够使用享元方式:
  三个连串有恢宏同一只怕相似的靶子,由于那类对象的豁达采纳,造成内部存款和储蓄器的豁达消耗。
  对象的多数气象都得以外部化,能够将那些外部状态传入对象中。
  使用享元形式须求爱抚一个仓库储存享元对象的享元池,而那亟需消耗电源,因而,应当在数次重复使用享元对象时才值得使用享元方式。

ConcreteFlyweight: 具体享元类 ConcreteWebSite.cs

ConcreteFlyweight: 具体享元类 ConcreteWebSite.cs

单纯享元格局和复合享元格局
  单纯享元形式:在一味享元形式中,全部的享元对象都是足以共享的,即怀有抽象享元类的子类都可共享,不存在非共享具体享元类
  复合享元形式:将一些一味享元使用组合方式加以组合,可以形成复合享元对象,这样的复合享元对象自小编无法共享,可是它们能够分解成单纯享元对象,而后人则足以共享。

using System;

namespace FlyweightPattern
{
    class ConcreteWebSite : WebSite
    {
        private string name = "";
        public ConcreteWebSite(string name)
        {
            this.name = name;
        }
        public override void User(User user)
        {
            Console.WriteLine("网站分类:" + name + "用户:" + user.Name);
        }
    }
}
using System;

namespace FlyweightPattern
{
    class ConcreteWebSite : WebSite
    {
        private string name = "";
        public ConcreteWebSite(string name)
        {
            this.name = name;
        }
        public override void User(User user)
        {
            Console.WriteLine("网站分类:" + name + "用户:" + user.Name);
        }
    }
}

享元形式与其它形式的联用
  在享元格局的享元工厂类中国和东瀛常提供三个静态的工厂方法用于再次回到享元对象,使用简易工厂格局来生成享元对象。
  在一个系统中,经常唯有唯一三个享元工厂,因而享元工厂类可以使用单例情势开始展览统一筹划。
  享元格局能够组合组合格局形成复合享元形式,统一对享元对象设置外部状态。

FlyweightFactory: 享元工厂类  WebSiteFactory.cs

FlyweightFactory: 享元工厂类  WebSiteFactory.cs

using System.Collections;

namespace FlyweightPattern
{
    class WebSiteFactory
    {
        private Hashtable flyweights = new Hashtable();

        //获得网站分类
        public WebSite GetWebSiteCategory(string key)
        {
            if (!flyweights.ContainsKey(key))
                flyweights.Add(key, new ConcreteWebSite(key));
            return ((WebSite)flyweights[key]);
        }

        //获得网站分类总数
        public int GetWebSiteCount()
        {
            return flyweights.Count;
        }
    }
}
using System.Collections;

namespace FlyweightPattern
{
    class WebSiteFactory
    {
        private Hashtable flyweights = new Hashtable();

        //获得网站分类
        public WebSite GetWebSiteCategory(string key)
        {
            if (!flyweights.ContainsKey(key))
                flyweights.Add(key, new ConcreteWebSite(key));
            return ((WebSite)flyweights[key]);
        }

        //获得网站分类总数
        public int GetWebSiteCount()
        {
            return flyweights.Count;
        }
    }
}

Client:客户类

Client:客户类

using System;

namespace FlyweightPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            WebSiteFactory f = new WebSiteFactory();
            WebSite fx = f.GetWebSiteCategory("产品展示");
            fx.User(new User("小菜"));

            WebSite fy = f.GetWebSiteCategory("产品展示");
            fy.User(new User("大鸟"));

            WebSite fz = f.GetWebSiteCategory("产品展示");
            fz.User(new User("娇娇"));

            WebSite fl = f.GetWebSiteCategory("博客");
            fl.User(new User("老顽童"));

            WebSite fm = f.GetWebSiteCategory("博客");
            fm.User(new User("桃谷六仙"));

            WebSite fn = f.GetWebSiteCategory("博客");
            fn.User(new User("令狐"));

            Console.WriteLine("得到的网站分类总数为 {0}", f.GetWebSiteCount());
            Console.Read();
        }
    }
}
using System;

namespace FlyweightPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            WebSiteFactory f = new WebSiteFactory();
            WebSite fx = f.GetWebSiteCategory("产品展示");
            fx.User(new User("小菜"));

            WebSite fy = f.GetWebSiteCategory("产品展示");
            fy.User(new User("大鸟"));

            WebSite fz = f.GetWebSiteCategory("产品展示");
            fz.User(new User("娇娇"));

            WebSite fl = f.GetWebSiteCategory("博客");
            fl.User(new User("老顽童"));

            WebSite fm = f.GetWebSiteCategory("博客");
            fm.User(new User("桃谷六仙"));

            WebSite fn = f.GetWebSiteCategory("博客");
            fn.User(new User("令狐"));

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

格局优缺点
享元方式的长处

享元形式的亮点在于它能够一点都不小减弱内存中对象的数码,使得一样对象或貌似对象在内部存款和储蓄器中只保留一份。

享元方式的外部状态相对独立,而且不会潜移默化个中间景色,从而使得享元对象能够在不相同的条件中被共享。

格局优缺点
享元形式的长处

享元格局的帮助和益处在于它能够十分的大减弱内部存款和储蓄器中对象的数额,使得一样对象或貌似对象在内部存款和储蓄器中只保留一份。

享元情势的表面状态相对独立,而且不会潜移默化其里面景色,从而使得享元对象能够在不相同的环境中被共享。

享元格局的先天不足

享元情势使得系统越来越扑朔迷离,需求分离出在那之中情况和外部状态,那使得程序的逻辑复杂化。

为了使对象足以共享,享元形式须求将享元对象的情况外部化,而读取外部状态使得运转时刻变长。

享元格局的弱项

享元形式使得系统特别错综复杂,须求分离出当中情状和表面状态,那使得程序的逻辑复杂化。

为了使对象足以共享,享元情势须要将享元对象的处境外部化,而读取外部状态使得运营时刻变长。

格局适用条件
在偏下意况下得以采纳享元格局:

三个系统有雅量相同或然相似的靶子,由于那类对象的大度行使,造成内部存款和储蓄器的大度消耗。
 对象的多数情况都得以外部化,能够将那几个外部状态传入对象中。

使用享元情势须要维护二个囤积享元对象的享元池,而那亟需消耗财富,由此,应当在数次重复使用享元对象时才值得使用享元情势。

情势适用条件
在偏下意况下得以采用享元格局:

三个系统有恢宏同等或许相似的指标,由于那类对象的雅量用到,造成内部存款和储蓄器的雅量消耗。
 对象的多数情状都能够外部化,能够将这几个外部状态传入对象中。

使用享元情势须求保证二个囤积享元对象的享元池,而那亟需消功耗源,由此,应当在数十四回重复使用享元对象时才值得使用享元格局。

【申明与感激】
正文,站在无数壮汉的肩膀上,借鉴和引用了众多客人拥有版权的著述或撰文,在此,对前人们的孝敬致谢。并同时公布引用的内容、原来的书文者或出自(一些来自网络的剧情自身不能追述本源,深表遗憾)。

【表明与谢谢】
正文,站在很多高个儿的肩膀上,借鉴和引用了众多客人拥有版权的作品或撰文,在此,对前人们的进献致谢。并还要揭露引用的剧情、原著者或缘于(一些源于互连网的始末笔者不只怕追述本源,深表遗憾)。

【参考文献】
《设计形式—可复用面向对象软件的基础》作者: [美] 埃里克h Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—改正既有代码的筹划》小编: 马丁 Fowler译者:候捷
中中原人民共和国电力出版社
《敏捷软件开发—原则、情势与执行》作者: 罗Bert C. 马丁 浙大东军事和政院学出版社
《程序员修炼之道—从小工到我们》作者: Andrew Hunt / 大卫 Thomas电子工业出版社
《Head First 设计情势》笔者: Freeman 译者: O’Reilly Taiwan公司中中原人民共和国电力出版社
《设计格局之禅》 小编: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计形式纵横谈》 教师:李建忠
刘伟同志. 设计格局. 法国巴黎:北大东军事和政院学出版社, 2012.
刘伟先生. 设计形式实训教程. 新加坡:南开东军事和政院学出版社, 贰零壹壹.
《大话设计情势》 我: 程杰 北大东军事和政院学出版社
《C#图解教程》笔者: 索Liss 译者: 苏林 / 朱晔 人民邮政和邮电通信出版社
《你必须理解的.NET》小编: 王涛
《项目中的.NET》小编: 李天平 电子工业出版社
《Microsoft .NET公司级应用架构划设想计》笔者: (美)埃斯波西托等撰写 译者:
陈黎夫
http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
http://www.cnblogs.com/zhenyulu 博客小编:吕震宇
http://www.cnblogs.com/terrylee 博客作者:李会军
http://www.cnblogs.com/anlyren/ 博客小编:anlyren
http://www.cnblogs.com/idior 博客作者:idior
http://www.cnblogs.com/allenlooplee 博客小编:Allen lee
http://blog.csdn.net/ai92澳门威尼斯人网址, 博客笔者:ai92
http://www.cnblogs.com/umlonline/ 博客作者:张传波
http://www.cnblogs.com/lovecherry/ 博客小编:LoveCherry

【参考文献】
《设计情势—可复用面向对象软件的底蕴》小编: [美] Erich Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—改进既有代码的安顿》小编: 马丁 Fowler译者:候捷
中中原人民共和国电力出版社
《敏捷软件开发—原则、格局与实践》小编: 罗伯特 C. 马丁 南开东军事和政院学出版社
《程序员修炼之道—从小工到咱们》小编: Andrew Hunt / 戴维 托马斯电子工业出版社
《Head First 设计方式》小编: Freeman 译者: O’Reilly Taiwan集团中华夏族民共和国电力出版社
《设计情势之禅》 作者: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计形式纵横谈》 教师:李建忠
刘伟先生. 设计形式. 新加坡:哈工大东军大学出版社, 二零一一.
Liu Wei. 设计形式实验和培养和练习教程. 巴黎:清华东军大学出版社, 2013.
《大话设计格局》 我: 程杰 北大东军事和政院学出版社
《C#图解教程》小编: 索Liss 译者: 苏林 / 朱晔 人民邮政和邮电通讯出版社
《你不能不清楚的.NET》笔者: 王涛
《项目中的.NET》作者: 李天平 电子工业出版社
《Microsoft .NET集团级应用架构划设想计》小编: (美)埃斯波西托等撰写 译者:
陈黎夫
http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
http://www.cnblogs.com/zhenyulu 博客小编:吕震宇
http://www.cnblogs.com/terrylee 博客笔者:李会军
http://www.cnblogs.com/anlyren/ 博客小编:anlyren
http://www.cnblogs.com/idior 博客我:idior
http://www.cnblogs.com/allenlooplee 博客小编:Allen lee
http://blog.csdn.net/ai92 博客小编:ai92
http://www.cnblogs.com/umlonline/ 博客作者:张传波
http://www.cnblogs.com/lovecherry/ 博客作者:LoveCherry

相关文章