屬于創(chuàng)建型模式谓传,又叫做靜態(tài)工廠方法(Static Factory Method)模式蜈项,但不屬于23種GOF設(shè)計模式之一。
簡單工廠模式是由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例续挟。簡單工廠模式是工廠模式家族中最簡單實(shí)用的模式紧卒,可以理解為是不同工廠模式的一個特殊實(shí)現(xiàn)。
優(yōu)點(diǎn)
工廠類是整個模式的關(guān)鍵.包含了必要的邏輯判斷,根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個具體類的對象.通過使用工廠類,外界可以從直接創(chuàng)建具體產(chǎn)品對象的尷尬局面擺脫出來,僅僅需要負(fù)責(zé)“消費(fèi)”對象就可以了诗祸。而不必管這些對象究竟如何創(chuàng)建及如何組織的.明確了各自的職責(zé)和權(quán)利跑芳,有利于整個軟件體系結(jié)構(gòu)的優(yōu)化。
缺點(diǎn)
由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯直颅,違反了高內(nèi)聚責(zé)任分配原則博个,將全部創(chuàng)建邏輯集中到了一個工廠類中;它所能創(chuàng)建的類只能是事先考慮到的功偿,如果需要添加新的類坡倔,則就需要改變工廠類了。
當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時候脖含,可能會出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)建不同實(shí)例的需求.這種對條件的判斷和對具體產(chǎn)品類型的判斷交錯在一起罪塔,很難避免模塊功能的蔓延,對系統(tǒng)的維護(hù)和擴(kuò)展非常不利养葵;
這些缺點(diǎn)在工廠方法模式中得到了一定的克服征堪。
使用場景
工廠類負(fù)責(zé)創(chuàng)建的對象比較少;
客戶只知道傳入工廠類的參數(shù)关拒,對于如何創(chuàng)建對象(邏輯)不關(guān)心佃蚜;
由于簡單工廠很容易違反高內(nèi)聚責(zé)任分配原則,因此一般只在很簡單的情況下應(yīng)用着绊。
下面寫一個簡單的計算器事例:
以下除Main方法谐算,其他都寫在 DesignPattern.Test1 命名空間
抽象出來的計算方法類
class Operation
{
private double _numberA = 0;//在子類中使用
private double _numberB = 0;//在子類中使用
public double NumberA
{
get { return _numberA; }
set { _numberA = value; }
}
public double NumberB
{
get { return _numberB; }
set { _numberB = value; }
}
//父類方法 供子類重寫
public virtual double GetResult()
{
double result = 0;
return result;
}
}
繼承Operation類,派生出來的加法類
class OperationAdd:Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
繼承Operation類归露,派生出來的減法類
class OperationSub:Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}
繼承Operation類洲脂,派生出來的乘法類
class OperationMul:Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA * NumberB;
return result;
}
}
繼承Operation類,派生出來的除法類剧包,
class OperationDiv:Operation
{
public override double GetResult()
{
double result = 0;
if (NumberB==0)
{
throw new Exception("除數(shù)不能為0");
}
result = NumberA / NumberB;
return result;
}
}
計算工廠類恐锦,根據(jù)傳入不同的operate來返回不同的具體運(yùn)算類
class OperationFactory
{
public static Operation creatOperation(string operate)
{
Operation oper = null;
switch (operate)
{
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
}
return oper;
}
}
在Main方法中運(yùn)行
using System;
using DesignPattern.Test1; //引用命名空間 要不找不到類
namespace DesignPattern
{
class Program
{
static void Main(string[] args)
{
MainHandle();
Console.ReadLine();
}
//簡單工廠模式
public static void MainHandle()
{
//聲明一個Operation變量
Operation oper;
//根據(jù)()內(nèi)的參數(shù)來實(shí)例化不同的具體運(yùn)算類
oper = OperationFactory.creatOperation("-");
oper.NumberA = 7;
oper.NumberB = 5;
Console.WriteLine(oper.GetResult());
}
}
}
本文章內(nèi)容是通過研讀程杰先生的《大話設(shè)計模式》有感往果,在此致敬程您為此作出的貢獻(xiàn)!R磺Α陕贮!