介紹:
提供了一個接口,無需指定它們具體的類,就可以創建一組密不可分的對象
主要解決:
主要解決接口選擇的問題
何時使用:
系統的產品有多於一個的產品族,而系統只消費其中某一族產品。
如何解決:
在一個產品族裏面,定義多個產品。
優點:
1、當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
缺點:
1、產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的Creator里加代碼,又要在具體的裏面加代碼
使用場景:
1、qq換皮膚,一整套一起換。
如何實現:
步驟一:創建接口類IColor、IShape
public interface IColor
{
void fill();
}
public interface IShape
{
void draw();
}
步驟二:創建實體類Rectangle、Square、Circle、Red、Green、Blue
public class Rectangle : IShape
{
public void draw()
{
Console.WriteLine("這是Rectangle中的draw方法");
}
}
public class Square : IShape
{
public void draw()
{
Console.WriteLine("這是Square中的draw方法");
}
}
public class Circle : IShape
{
public void draw()
{
Console.WriteLine("這是Circle中的draw方法");
}
}
public class Red : IColor
{
public void fill()
{
Console.WriteLine("這是Red中的fill方法");
}
}
public class Green : IColor
{
public void fill()
{
Console.WriteLine("這是Green中的fill方法");
}
}
public class Blue : IColor
{
public void fill()
{
Console.WriteLine("這是Blue中的fill方法");
}
}
步驟三:創建IAbstractFactory,爲IColor和IShape對象創建接口來獲取工廠
public interface IAbstractFactory
{
IColor GetColor(string color);
IShape GetShape(string shape);
}
步驟四:創建AbstractFactory,基於給定的信息生成實體類的對象。
public class AbstractFactory : IAbstractFactory
{
public IColor GetColor(string colorType)
{
if (colorType.Equals("Red")) {
return new Red();
} else if (colorType.Equals("Green")) {
return new Green();
} else if (colorType.Equals("Blue")) {
return new Blue();
}
return null;
}
public IShape GetShape(string shapeType)
{
if (shapeType.Equals("Circle")) {
return new Circle();
} else if (shapeType.Equals("Rectangle")) {
return new Rectangle();
} else if (shapeType.Equals("Square")) {
return new Square();
}
return null;
}
}
步驟五:創建一個工廠創造器/生成器類FactoryProducer
public class FactoryProducer
{
public static IAbstractFactory GetFactory() {
return new AbstractFactory();
}
}
步驟六:使用 FactoryProducer 來獲取 AbstractFactory,通過傳遞類型信息來獲取實體類的對象。
static void Main(string[] args)
{
#region 單例模式
{
//單例模式 Singleton
Console.WriteLine("========================單例模式========================");
//餓漢式,不用加鎖,執行效率高,但很容易產生垃圾對象
SingleObjectA singletonA = SingleObjectA.getInstance();
singletonA.showMessage();
//懶漢式,線程不安全
SingleObjectB singleObjectB = SingleObjectB.getInstance();
singleObjectB.showMessage();
//懶漢式,線程安全 雙重加鎖
SingleObjectC singleObjectC = SingleObjectC.GetSingleObjectC();
singleObjectC.showMessage();
}
#endregion
#region 抽象工廠模式
{
//抽象工廠模式
Console.WriteLine("========================抽象工廠模式========================");
IAbstractFactory abstractFactory = FactoryProducer.GetFactory();
//獲取Circle的對象
IShape shape1 = abstractFactory.GetShape("Circle");
//調用方法
shape1.draw();
//獲取Rectangle對象
IShape shape2 = abstractFactory.GetShape("Rectangle");
//調用方法
shape2.draw();
//獲取Square對象
IShape shape3 = abstractFactory.GetShape("Square");
//調用方法
shape3.draw();
//獲取Red對象
IColor shape4 = abstractFactory.GetColor("Red");
//調用對象
shape4.fill();
//獲取Green對象
IColor shape5 = abstractFactory.GetColor("Green");
//調用對象
shape5.fill();
//獲取Blue對象
IColor shape6 = abstractFactory.GetColor("Blue");
//調用對象
shape6.fill();
}
#endregion
Console.ReadLine();
}
運行結果爲: