2019/05/19
Creational Design Patterns主要是一些產生物件的作法,不同的pattern要解決不同的問題。
public class DbContext
{
public string Server { get; set; }
public string ConnectionStr { get; set; }
public void Connect()
{
System.Diagnostics.Trace.WriteLine($"Connect to {this.Server}");
}
}
public enum DbEnum
{
DataMart = 1,
History,
Online
}
Static factory (Class Factory Method)
public class StcDbFactory
{
public static DbContext Create(DbEnum dbEnum)
{
switch (dbEnum)
{
case DbEnum.DataMart:
return new DbContext()
{
Server = "DataMart",
ConnectionStr = "DataMart connection string"
};
case DbEnum.History:
return new DbContext()
{
Server = "History",
ConnectionStr = "History connection string"
};
case DbEnum.Online:
return new DbContext()
{
Server = "Online",
ConnectionStr = "Online connection string"
};
default:
throw new Exception("No mapping database settings!");
}
}
public static DbContext CreateDataMart()
{
return new DbContext()
{
Server = "DataMart",
ConnectionStr = "DataMart connection string"
};
}
public static DbContext CreateHistory()
{
return new DbContext()
{
Server = "History",
ConnectionStr = "History connection string"
};
}
public static DbContext CreateOnline()
{
return new DbContext()
{
Server = "Online",
ConnectionStr = "Online connection string"
};
}
}
使用方式
//1. 由參數決定建立哪種連線
var dmDbcontext = StcDbFactory.Create(DbEnum.DataMart);
dmDbcontext.Connect();
//2. 直接呼叫對應的方法
var olDbcontext = StcDbFactory.CreateOnline();
olDbcontext.Connect();
Abstract factory,把Factory分割成多個子類別,而Factory本身就變成一個Abstract class
public abstract class AbsDbFactory
{
public abstract DbContext Create();
}
public class DataMartDbFactory : AbsDbFactory
{
public override DbContext Create()
{
return new DbContext()
{
Server = "DataMart",
ConnectionStr = "DataMart connection string"
};
}
}
public class HistoryDbFactory : AbsDbFactory
{
public override DbContext Create()
{
return new DbContext()
{
Server = "History",
ConnectionStr = "History connection string"
};
}
}
public class OnlineDbFactory : AbsDbFactory
{
public override DbContext Create()
{
return new DbContext()
{
Server = "Online",
ConnectionStr = "Online connection string"
};
}
}
使用方式
var dmFactory = new DataMartDbFactory();
var dmDbcontext = dmFactory.Create();
dmDbcontext.Connect();