C#デザインパターン  - FlyWeight

ここに掲載したコードは、『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』に掲載されているサンプルコードをC#に移植したものです。
解説らしい解説は載せていませんので、『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』も合わせてお読みください。

※当ソースは、Visual C# 2008 Express Editionで動作を確認しています。
  Visual Studio 2005をお使いの方は、ブログの記事を残しておきますので、そちらをご覧ください。





■BigChar.cs
using System;
using System.IO;
using System.Text;

namespace Gushwell.DesignPatterns {
    public class BigChar {
        private string fontdata;    // 大きな文字を表現する文字列('#' '.' '\n'の列)

        // コンストラクタ
        internal BigChar(char charname) {
            try {
                using (StreamReader reader = new StreamReader("big" + charname + ".txt")) {
                    string line;
                    StringBuilder buf = new StringBuilder();
                    while ((line = reader.ReadLine()) != null) {
                        buf.AppendLine(line);
                    }
                    this.fontdata = buf.ToString();
                }
            } catch (System.IO.IOException) {
                this.fontdata = charname + "?";
            }
        }

        // 大きな文字を表示する
        public virtual void Print() {
            Console.Write(fontdata);
        }
    }
}



■BigCharFactory.cs
using System;
using System.Collections.Generic;

namespace Gushwell.DesignPatterns {
    // たくさんの BigCharインスタンスが生成されないように管理する。
    public sealed class BigCharFactory {
        // すでに作ったBigCharのインスタンスを管理
        private Dictionary<char, BigChar> pool = new Dictionary<char, BigChar>();

        // Singletonパターン
        private static readonly BigCharFactory singleton = new BigCharFactory();

        // 唯一のインスタンスを得る
        public static BigCharFactory Instance {
            get { return singleton; }
        }

        // コンストラクタ
        private BigCharFactory() {
        }

        // BigCharのインスタンス生成(共有)
        public BigChar GetBigChar(char charname) {
            lock (this) {
                BigChar bc = null;
                if (pool.ContainsKey(charname)) {
                    // 生成済みならば、poolにあるインスタンスを返す。
                    bc = pool[charname];
                } else {
                    // ここでBigCharのインスタンスを生成
                    bc = new BigChar(charname); 
                    pool[charname] = bc;
                }
                return bc;
            }
        }
    }
}



■BigString.cs
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Linq;
using Gushwell.Dejavu;

namespace Gushwell.DesignPatterns {
    public class BigString {
        private BigChar[] bigchars; // 「大きな文字」の配列

        // コンストラクタ
        public BigString(string str) {
            bigchars = new BigChar[str.Length];
            BigCharFactory factory = BigCharFactory.Instance;
            int i = 0;
            str.ForEach(ch => bigchars[i++] = factory.GetBigChar(ch));
        }

        // 表示
        public virtual void Print() {
            bigchars.ForEach(bc => bc.Print());
        }
    }

}





■Program.cs
using System;

namespace Gushwell.DesignPatterns {
    public class Program {
        public static void Main(string[] args) {
            if (args.Length == 0) {
                Console.WriteLine("Usage: Flyweight digits");
                Console.WriteLine("Example: Flyweight 1212123");
                return;
            }
            BigString bs = new BigString(args[0]);
            bs.Print();
        }
    }
}





■EnumerableExtentions.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Gushwell.Dejavu {
    public static class EnumerableExtentions {
        public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) {
            foreach (var x in source) {
                action(x);
            }
        }

        public static void ForEach<T>(this IEnumerable<T> source, Action<T, int> func) {
            int i = 0;
            foreach (var x in source) {
                func(x, i);
                i++;
            }
        }
    }
}


■Big0.txt.cs
....######......
..##......##....
..##......##....
..##......##....
..##......##....
..##......##....
....######......
................


他の文字パターンファイルは省略(ダウンロードファイルに含まれています)