Skip to content

Instantly share code, notes, and snippets.

@nuitsjp
Last active May 22, 2016 12:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nuitsjp/7451f3b690b65dc474f3614e779e827a to your computer and use it in GitHub Desktop.
Save nuitsjp/7451f3b690b65dc474f3614e779e827a to your computer and use it in GitHub Desktop.
using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace SingletonSample
{
class Program
{
static void Main(string[] args)
{
Task.Run(async () =>
{
// 全ての販売情報を取得する
foreach (var x in await SingletonClass.Instance.GetSalesAsync())
{
Console.WriteLine($"Area:{x.Area},Store:{x.StoreName},Catetory:{x.Category},Segment:{x.Segment},Sales:{x.Sales}");
}
// カテゴリー別販売情報を取得する
foreach (var x in await SingletonClass.Instance.GetSalesByCategoriesAsync())
{
Console.WriteLine($"Category:{x.Category},Sales:{x.Sales}");
}
// 販売情報を追加する
await SingletonClass.Instance.AddSalesAsync(new SalesModel { Area = "A", StoreName = "B", Category = "C", Segment = "F3", Sales = 100000d });
foreach (var x in await SingletonClass.Instance.GetSalesAsync())
{
Console.WriteLine($"Area:{x.Area},Store:{x.StoreName},Catetory:{x.Category},Segment:{x.Segment},Sales:{x.Sales}");
}
}).Wait();
Console.ReadLine();
}
}
/// <summary>
/// システム全体から一つしかインスタンスが存在しないことを保証するクラス。
/// 「シングルトン=たった一つの」を保証するデザインパターン
/// </summary>
public class SingletonClass
{
/// <summary>
/// たった一つのインスタンス
/// </summary>
public static SingletonClass Instance { get; } = new SingletonClass();
/// <summary>
/// 取得するのが重たいオブジェクト
/// </summary>
private Lazy<IList<SalesModel>> sales = new Lazy<IList<SalesModel>>(LoadSales, true);
/// <summary>
/// インスタンスが一つきりであることを保証するためコンストラクタは隠ぺいする
/// </summary>
private SingletonClass()
{
}
/// <summary>
/// SalesModelの情報をロードする。
/// 実際にはネットワークからJSONテキストを取得してデシリアライズする重たい処理を想定する
/// </summary>
/// <returns></returns>
private static IList<SalesModel> LoadSales()
{
var result = new List<SalesModel>();
result.Add(new SalesModel { Area = "南", StoreName = "品川店", Category = "メインメニュー", Segment = "F1", Sales = 5809d });
result.Add(new SalesModel { Area = "南", StoreName = "品川店", Category = "サイドメニュー", Segment = "F1", Sales = 72506d });
result.Add(new SalesModel { Area = "南", StoreName = "品川店", Category = "ドリンク", Segment = "F1", Sales = 30927d });
result.Add(new SalesModel { Area = "南", StoreName = "品川店", Category = "メインメニュー", Segment = "F2", Sales = 52860d });
result.Add(new SalesModel { Area = "南", StoreName = "品川店", Category = "サイドメニュー", Segment = "F2", Sales = 56678d });
result.Add(new SalesModel { Area = "南", StoreName = "品川店", Category = "ドリンク", Segment = "F2", Sales = 19575d });
result.Add(new SalesModel { Area = "南", StoreName = "品川店", Category = "メインメニュー", Segment = "F3", Sales = 25008d });
return result;
}
/// <summary>
/// 販売情報を取得する
/// </summary>
/// <returns></returns>
public Task<SalesModel[]> GetSalesAsync()
{
return Task.Run(() =>
{
return sales.Value.ToArray();
});
}
/// <summary>
/// カテゴリー別の販売情報を取得する
/// </summary>
/// <returns></returns>
public Task<SalesByCategoryModel[]> GetSalesByCategoriesAsync()
{
return Task.Run(async () =>
{
var sales = await GetSalesAsync();
return sales.GroupBy(x => x.Category)
.Select(x => new SalesByCategoryModel
{
Category = x.Key,
Sales = x.Sum(y => y.Sales)
}).ToArray();
});
}
/// <summary>
/// 新しいSales情報を追加する
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public Task AddSalesAsync(SalesModel value)
{
return Task.Run(() =>
{
sales.Value.Add(value);
});
}
}
public class SalesModel
{
public string Area { get; set; }
public string StoreName { get; set; }
public string Category { get; set; }
public string Segment { get; set; }
public double Sales { get; set; }
}
public class SalesByCategoryModel
{
public string Category { get; set; }
public double Sales { get; set; }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment