安徽宿州住房与城乡建设玩网站,程序员一个月能挣多少钱,平台型网站开发,网站建设制作服务享元模式#xff08;Flyweight#xff09; 运用共享技术有效地支持大量细粒度的对象。 还记得那年夏天一起在作文本上玩过的五子棋吗#xff1f;五子棋是一种两人对弈的纯策略型棋类游戏#xff0c;它起源于中国古代的传统黑白棋种之中的一个#xff0c;不… 享元模式Flyweight 运用共享技术有效地支持大量细粒度的对象。 还记得那年夏天一起在作文本上玩过的五子棋吗五子棋是一种两人对弈的纯策略型棋类游戏它起源于中国古代的传统黑白棋种之中的一个不仅能增强思维能力提高智力并且富含哲理有助于修身养性。 假设我们要做一个五子棋游戏的程序该怎么做呢看看五子棋游戏中的棋子就是“黑子”和“白子”两种类型假设每次都创建一个新的对象实例是不是太消耗系统内存了呢以下就为大家解决这一问题using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;namespace 享元模式
{//抽象棋子类public abstract class AbstractChessman{//棋子坐标protected int x;protected int y;//棋子类别黑|白protected string chess;public AbstractChessman (string chess){this.chess chess;}//点坐标设置public abstract void point(int x,int y);//显示棋子信息public void show(){Console.WriteLine(this.chess (this.x,this.y ));}}//黑色棋子实现public class BlackChessman :AbstractChessman{public BlackChessman(): base(●){Console.WriteLine(--BlackChessman Construction Exec!!!);}public override void point(int x,int y){this.x x;this.y y;this.show();}}//白色棋子实现public class WhiteChessman :AbstractChessman{public WhiteChessman(): base(○){Console.WriteLine(--WhiteChessman Construction Exec!!!);}public override void point(int x, int y){this.x x;this.y y;this.show();}}//创建棋子工厂public class FiveChessmanFactory{//单例模式工厂private static FiveChessmanFactory fiveChessmanFactory new FiveChessmanFactory();//缓存存放共享对象private Hashtable cache new Hashtable();//私有化构造方法private FiveChessmanFactory(){ }//获得单例工厂public static FiveChessmanFactory getInstance(){return fiveChessmanFactory;}public AbstractChessman getChessmanObject(string c){//从缓存中获得棋子对象实例AbstractChessman abstractChessman (AbstractChessman)this.cache[c];if (abstractChessman null){//缓存中没有棋子对象实例信息则创建棋子对象实例并放入缓存switch (c){case B:abstractChessman new BlackChessman();break;case W:abstractChessman new WhiteChessman();break;default:break;}//为防止非法字符的进入返回nullif (abstractChessman !null){cache.Add(c, abstractChessman);}}return abstractChessman;}}class Program{static void Main(string[] args){//创建五子棋工厂FiveChessmanFactory fiveChessmanFactory FiveChessmanFactory.getInstance();//随机数用来生成棋子对象Random random new Random();int radom 0;AbstractChessman abstractChessman null;for (int i 0; i 10; i){radom random.Next(2);switch (radom){case 0:abstractChessman fiveChessmanFactory.getChessmanObject(B);break;case 1:abstractChessman fiveChessmanFactory.getChessmanObject(W);break;}if (abstractChessman !null){//设置棋子位置信息abstractChessman.point(i, random.Next(15));}}}}
}
享元模式类图 在类图中包括例如以下几个角色 Flyweight抽象享元角色全部详细享元的超类为详细享元类规定出须要实现的公共接口。 ConcreteFlyweight详细享元角色实现抽象享元角色所规定的接口。假设有内含状态则必须负责为内含状态提供存储空间。 FlyweightFactory享元工厂角色负责创建和管理享元角色。必须保证享元对象能够被系统适当地共享。主要长处 1.能够极大降低内存中对象的数量使得同样或相似对象在内存中仅仅保存一份从而能够节约系统资源提高系统性能。 2.享元模式的外部状态相对独立并且不会影响其内部状态从而使得享元对象能够在不同的环境中被共享。主要缺点 1.享元模式使得系统变得复杂须要分离出内部状态和外部状态这使得程序的逻辑复杂化。 2.为了使对象能够共享享元模式须要将享元对象的部分状态外部化而读取外部状态将使得执行时间变长。适用场景 1.当系统中某个对象类型的实例较多的时候。 2. 对象的大部分状态都能够外部化能够将这些外部状态传入对象中。 相关的设计模式 1.组合能够使用享元共享组合中的叶子节点从而提高系统的处理效率。 2.单例在享元中一般都是想享元工厂设置为单例以减少系统使用空间。单例本身就是一种享元单例仅仅有一个对象实例被其它对象所共享。转载于:https://www.cnblogs.com/bhlsheji/p/4209208.html