享元方式通过共享技术实现平等或一般对象的采纳澳门威尼斯人网址,享元格局通过共享技术实现平等或貌似对象的选定

方式动机
澳门威尼斯人网址 1
澳门威尼斯人网址 2

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

享元情势:
  享元情势(Flyweight
Pattern):运用共享技术可行地援救大气细粒度对象的复用。系统只利用少量的指标,而这一个指标都很一般,状态变化不大,能够兑现目的的一再复用。由于享元情势供给能够共享的靶子必须是细粒度对象,因而它又叫做轻量级方式,它是一种对象结构型方式。

面向对象技术能够很好地解决一些回船转舵或可扩大性难题,但在广大境况下必要在系统中增添类和目的的个数。当指标数量太多时,将促成运营代价过高,带来质量下落等难点。
享元情势便是为缓解这一类标题而诞生的。享元方式通过共享技术完毕均等或相似对象的任用。
澳门威尼斯人网址 5

面向对象技术能够很好地消除一些借坡下驴或可扩张性难题,但在许多意况下必要在系统中扩张类和目的的个数。当对象数量太多时,将促成运维代价过高,带来品质下落等题材。
享元方式正是为消除这一类题材而诞生的。享元形式通过共享技术达成平等或貌似对象的选定。
澳门威尼斯人网址 6

形式动机:
  面向对象技术能够很好地解决一些见风使舵或可扩张性难点,但在许多情形下须要在系统中增添类和目的的个数。当对象数量太多时,将导致运营代价过高,带来品质下落等题材。
  享元形式就是为缓解这一类题材而诞生的。享元方式通过共享技术达成平等或一般对象的选定。
  在享元形式中得以共享的相同内容称为内部情状(IntrinsicState),而那么些急需外部环境来设置的不可能共享的始末称为外部状态(Extrinsic
State),由于区分了内部景色和外部状态,因而可以通过安装分歧的外部状态使得一样的靶子足以拥有部分例外的性状,而同样的内部景观是足以共享的。
  在享元情势中常见会油但是生工厂形式,要求成立2个享元工厂来顶住维护1个享元池(Flyweight
Pool)用于存款和储蓄具有相同之中情状的享元对象。
  在享元情势中国共产党享的是享元对象的内部景观,外部状态需求通过环境来安装。在其实应用中,能够共享的中间景观是少数的,因而享元对象一般都统一筹划为较小的对象,它所涵盖的当中意况较少,那种对象也称为细粒度对象。享元情势的指标就是利用共享技术来达成大气细粒度对象的复用。

在享元方式中能够共享的同一内容称为内部景象(Intrinsic
State),而那几个须求外部环境来安装的不能够共享的始末称为外部状态(Extrinsic
State),由于区分了里面意况和表面状态,由此得以因而设置不相同的外表状态使得同一的靶子能够有所局地不比的特色,而相同的里边景况是能够共享的。
在享元形式中国和东瀛常会并发工厂形式,需求创设四个享元工厂来负责维护二个享元池(Flyweight
Pool)用于存款和储蓄具有相同之中情状的享元对象。
在享元情势中国共产党享的是享元对象的中间景色,外部状态需求通过环境来安装。在实际上选拔中,能够共享的内部景观是简单的,因而享元对象一般都安顿为较小的靶子,它所包括的中间意况较少,那种对象也号称细粒度对象。享元情势的目标正是运用共享技术来落到实处大气细粒度对象的复用。

在享元形式中得以共享的一样内容称为内部意况(Intrinsic
State),而那多少个急需外部环境来设置的不可能共享的始末称为外部状态(Extrinsic
State),由于区分了内部景色和外部状态,因而能够通过安装分歧的外部状态使得一样的对象足以具有部分见仁见智的表征,而同一的里边景色是足以共享的。
在享元形式中常见会师世工厂形式,需求创制三个享元工厂来担负爱戴三个享元池(Flyweight
Pool)用于存款和储蓄具有同样之中景色的享元对象。
在享元形式中国共产党享的是享元对象的中间情状,外部状态必要通过环境来设置。在实质上选用中,能够共享的在那之中情状是少数的,因而享元对象一般都规划为较小的靶子,它所包罗的里边情状较少,那种对象也称之为细粒度对象。享元格局的指标正是接纳共享技术来促成大气细粒度对象的复用。

重在剧中人物:
  抽象享元(Flyweight)剧中人物:此剧中人物是有着的具体享元类的超类,为那个类规定出须要完成的公共接口。那几个供给外蕴状态的操作能够因此调用商业以参数格局传播
  具体享元(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

情势分析:
  享元形式是一个设想系统个性的设计情势,通过动用享元格局能够节约内部存款和储蓄器空间,提升系统的性情。
  享元情势的主导在于享元工厂类,享元工厂类的效用在于提供二个用以存款和储蓄享元对象的享元池,用户要求对象时,首先从享元池中得到,即便享元池中不存在,则开创2个新的享元对象回来给用户,并在享元池中保存该新增对象。
  享元情势以共享的措施相当的慢地支撑大气的细粒度对象,享元对象能一气呵成共享的最主如若分别内部景色(Internal
State)和表面状态(External State)。
  内部景况是储存在享元对象内部并且不会随环境改观而变更的事态,由此内部情状能够共享。
  外部状态是随环境改变而更改的、不得以共享的气象。享元对象的外表状态必须由客户端保存,并在享元对象被创制之后,在急需采纳的时候再传出到享元对象内部。三个表面状态与另3个外表状态之间是相互独立的。

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; }
        }
    }
}

在以下境况下得以选用享元情势:
  三个系统有雅量一模一样可能相似的对象,由于那类对象的大气使用,造成内部存款和储蓄器的雅量消耗。
  对象的绝抢先1/2情景都得以外部化,能够将这么些外部状态传入对象中。
  使用享元方式供给保护三个储存享元对象的享元池,而这亟需消耗电源,因而,应当在多次重复使用享元对象时才值得使用享元形式。

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();
        }
    }
}

方式优缺点
享元情势的亮点

享元方式的长处在于它能够极大减少内部存储器中对象的数据,使得一样对象或貌似对象在内部存款和储蓄器中只保留一份。

享元方式的外表状态相对独立,而且不会影响其内部景观,从而使得享元对象能够在不相同的环境中被共享。

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

享元方式的帮助和益处在于它能够极大缩短内部存款和储蓄器中对象的数码,使得一样对象或貌似对象在内部存款和储蓄器中只保留一份。

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

享元形式的后天不足

享元方式使得系统尤其错综复杂,必要分离出个中情状和表面状态,那使得程序的逻辑复杂化。

为了使对象能够共享,享元形式供给将享元对象的意况外部化,而读取外部状态使得运营时刻变长。

享元格局的弱项

享元方式使得系统越发错综复杂,须求分离出在这之中景况和表面状态,那使得程序的逻辑复杂化。

为了使对象可以共享,享元格局供给将享元对象的情状外部化,而读取外部状态使得运营时刻变长。

情势适用条件
在以下景况下能够使用享元情势:

一个种类有恢宏同样大概相似的目的,由于那类对象的豁达运用,造成内部存款和储蓄器的豁达消耗。
 对象的大部景观都能够外部化,能够将那一个外部状态传入对象中。

使用享元格局须要保险三个仓库储存享元对象的享元池,而那须求消耗财富,由此,应当在多次重复使用享元对象时才值得使用享元情势。

格局适用条件
在以下情形下能够行使享元格局:

多个连串有大批量平等恐怕相似的对象,由于那类对象的多量选择,造成内部存款和储蓄器的大方消耗。
 对象的多数情形都足以外部化,能够将这一个外部状态传入对象中。

使用享元方式必要保险3个仓库储存享元对象的享元池,而那亟需消耗财富,因而,应当在数次重复使用享元对象时才值得使用享元格局。

【申明与谢谢】
正文,站在诸多高个子的肩头上,借鉴和引用了广大旁人拥有版权的创作或撰文,在此,对前人们的贡献致谢。并同时公布引用的始末、原笔者或出自(一些出自网络的内容本人不能追述本源,深表遗憾)。

【评释与感激】
本文,站在无数大个子的肩膀上,借鉴和引用了广大客人拥有版权的作品或撰文,在此,对前人们的孝敬致谢。并还要透露引用的内容、原小编或缘于(一些起点网络的情节作者不能够追述本源,深表遗憾)。

【参考文献】
《设计形式—可复用面向对象软件的基础》小编: [美] 埃里克h Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—改正既有代码的筹划》作者: 马丁 Fowler译者:候捷
中中原人民共和国电力出版社
《敏捷软件开发—原则、情势与实践》小编: 罗Bert C. 马丁 清华大学出版社
《程序员修炼之道—从小工到大方》作者: Andrew Hunt / 大卫 托马斯电子工业出版社
《Head First 设计方式》小编: Freeman 译者: O’Reilly Taiwan公司中国电力出版社
《设计形式之禅》 作者: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计格局纵横谈》 教师:李建忠
刘伟同志. 设计情势. 东京:浙大东军政高校学出版社, 二〇一二.
刘伟(Liu-Wei). 设计方式实验和培训教程. 香江:浙大东军大学出版社, 二零一一.
《大话设计形式》 小编: 程杰 南开东军事和政院学出版社
《C#图解教程》小编: 索利斯 译者: 苏林 / 朱晔 人民邮政和邮电通讯出版社
《你必须理解的.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

【参考文献】
《设计形式—可复用面向对象软件的基本功》小编: [美] 埃里克h Gamma / RichardHelm / Ralph Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—改进既有代码的宏图》作者: 马丁 Fowler译者:候捷
中中原人民共和国电力出版社
《敏捷软件开发—原则、方式与实践》小编: 罗Bert C. 马丁 北大东军事和政院学出版社
《程序员修炼之道—从小工到大方》笔者: Andrew Hunt / 戴维 Thomas电子工业出版社
《Head First 设计情势》小编: Freeman 译者: O’Reilly Taiwan公司中国电力出版社
《设计格局之禅》 小编: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计形式纵横谈》 教授:李建忠
刘伟先生. 设计形式. 法国首都:交大东军大学出版社, 二〇一二.
刘伟同志. 设计形式实验和培养和练习教程. 巴黎:北大东军事和政治大学学出版社, 二零一二.
《大话设计情势》 笔者: 程杰 清华出版社
《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

相关文章