结构型模式-享元Flyweight模式

原创 2018年04月15日 10:28:15

        享元模式解决由于存在大量的细粒度对象而造成不必要的内存开销的问题,它与外观模式恰好相反,关注的重点是细小的对象。

        享元对象共享是要区分内部状态和外部状态,内部对象不随环境的变化,可以共享;外部对象通常是由客户端调用的时候传递的,不共享。

 

享元模式角色:

    ◊Flyweight声明一个接口,来接收并作用于外部状态

    ◊ConcreteFlyweight实现Flyweight接口,为内部状态增加存储空间。ConcreteFlyweight对象是可以共享的,它所存储的状态必须是内部的,即它独立于具体对象的场景

    ◊UnsharedConcreteFlyweight并不是所有的Flyweight子类都需要被共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点,该对象也可以没有。

    ◊FlyweightFactory创建和管理flyweight对象

装饰模式适用情形:

    ◊ 在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。


结构图:





namespace Libraries.Test.DesignPattern.Flyweight
{
    public interface IShape
    {
        string Draw(int x, int y, int length);
    }
}
namespace Libraries.Test.DesignPattern.Flyweight
{
    /// <summary>
    /// 画直线
    /// </summary>
    public class Line : IShape
    {
        //颜色为享元对象
        private String color;

        public Line(string color)
        {
            this.color = color;
        }

        public string Draw(int x, int y, int length)
        {
            return "画直线:颜色:" + this.color + ",起点坐标[" + x + "," + y + "],长度:" + length + "";
        }
    }
}
namespace Libraries.Test.DesignPattern.Flyweight
{
    public class ShapeFactory
    {
        private IDictionary<string, IShape> dictShape = new Dictionary<string, IShape>();
        public ShapeFactory()
        {
            dictShape.Add("红色", new Line("红色"));
            dictShape.Add("绿色", new Line("绿色"));
            dictShape.Add("蓝色", new Line("蓝色"));
        }


        /// <summary>
        /// 画直线
        /// </summary>
        /// <param name="color"></param>
        /// <returns></returns>
        public IShape getLine(string color)
        {
            IShape shape = dictShape[color];
            if (shape == null)
            {
                shape = new Line(color);
                dictShape.Add(color, shape);
            }
            return shape;
        }
    }
}
namespace Libraries.Test.DesignPattern.Flyweight
{
    public class Client
    {
        public void Excute()
        {
            ShapeFactory shapeFactory = new ShapeFactory();
            //共享对象
            IShape shape = shapeFactory.getLine("红色");
            //非共享对象
            string strLine = shape.Draw(25, 35, 100);
        }
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wdeng2011/article/details/79947117

浅谈JAVA设计模式之——享元模式(Flyweight)

一、概述 运用共享技术有效地支持大量细粒度的对象。 二、适用性 当都具备下列情况时,使用Flyweight模式:        1.一个应用程序使用了大量的对象。        2.完全由于使用大...
  • l1028386804
  • l1028386804
  • 2015年05月07日 23:46
  • 1793

JAVA设计模式之享元模式

解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象...
  • jason0539
  • jason0539
  • 2014年04月04日 07:34
  • 32732

【结构型模式】flyweight(享元)

1. 意图 运用共享技术有效地支持大量细粒度的对象。 2. 适用性 flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用它。当以下情况都 立时使用flyweight模式: • 一个应...
  • lingqi1818
  • lingqi1818
  • 2014年06月16日 09:45
  • 176

享元设计模式例子

一、概述主要为了在创建对象时,对共有对象以缓存的方式进行保存,对外部对象进行单独创建.二、涉及角色抽象享元:一个接口或抽象类; 具体享元:内部状态为其成员属性,其实例为享元对象,可以共享; 享元工...
  • disiwei1012
  • disiwei1012
  • 2016年12月10日 13:48
  • 317

Android设计模式之享元模式(Flyweight Pattern)

一 享元模式介绍:1.1 使用享元模式有什么好处? 享元模式是对象池的一种实现,主要目的是用来尽可能减少内存使用量。适合于存在大量重复对象的场景,来缓存可共享的对象,达到对象共享,避免创建过多对象...
  • happy_horse
  • happy_horse
  • 2016年04月14日 15:56
  • 1024

结构型模式:Flyweight(享元)

import java.util.HashMap; import java.util.Map; // Flyweight object interface interface CoffeeOrde...
  • derek_yi
  • derek_yi
  • 2013年02月07日 20:25
  • 143

结构型模式-享元(flyweight)

享元运用共享技术有效地支持大量细粒度的对象.实例main.cc:#include "clothes_factory.h" #include "leading_runner_clothes.h" #in...
  • dabenxiong666
  • dabenxiong666
  • 2017年03月20日 21:49
  • 2726

漫谈设计模式之享元模式(Flyweight)

什么是享元模式?享元模式是构造型设计模式之一,它通过与其他类似对象共享数据来减少内存使用。 享元模式的角色和职责: 享元模式(Flyweight)中有一个类似Factory模式中的对象构造工厂Fl...
  • Heaven_Evil
  • Heaven_Evil
  • 2017年04月21日 10:14
  • 189

浅谈Java设计模式(十二)享元模式(Flyweight)

前言: 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。 FlyWeightFactory负责创建和管理享元单元,当一...
  • caihongdao123
  • caihongdao123
  • 2016年07月11日 10:02
  • 2638

设计模式---享元模式(C++实现)

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,减少内存占用和提高性能。这种设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式尝试重用...
  • My_heart_
  • My_heart_
  • 2017年03月16日 14:48
  • 699
收藏助手
不良信息举报
您举报文章:结构型模式-享元Flyweight模式
举报原因:
原因补充:

(最多只允许输入30个字)