設計模式(C#)——簡單工廠模式
推薦閱讀:
工廠模式主要是為建立物件提供過渡介面,以便將建立物件的具體過程遮蔽隔離起來。通俗來說,你只關心怎麼用,不用關心怎麼做。
工廠模式可以分為三類:
1.簡單工廠模式(Simple Factory)
2.工廠方法模式(Factory Method)
3.抽象工廠模式(Abstract Factory)
掌握簡單工廠模式是我們學習工廠模式最基礎的條件,只有理解了簡單的,才能更深入的學習。對於剛接觸設計模式的朋友來說,看前一篇單例模式的朋友覺得挺輕鬆,但今天要將的工廠模式可能就不是特別容易消化了。為了讓大家更深刻的理解這個模式,我將給大家展現出一個有趣的學習過程。
簡單工廠模式(Simple Factory Pattern)
簡單工廠模式又稱靜態工廠方法模式(Static Factory Method)。
簡單工廠模式要素:
①抽象基類:類中定義抽象一些方法,用以在子類中實現,通俗的說就是抽象產品。例:運算類my_opterator
②繼承自抽象基類的子類:實現基類中的抽象方法,通俗的說就是具體的產品。例:加法類ADDopterator,乘法類MULopertator等
③工廠類:用以例項化物件。例如:factory
下面舉個例子用類圖來介紹一下上面幾個要素之間的關係吧。
實現算術運算:
名稱空間簡單工廠模式中包含抽象運算基類my_opterator、四個具體運算類、工廠類factory。本案例將向大家展示如何使用簡單工廠模式來進行不同的算術運算。
程式碼實現過程:
1.建立抽象類my_opterator
abstract class my_opterator //演算法類父類 { private double m_a, m_b; public double A //A屬性 { get { return m_a; } set { m_a = value; } } public double B //B屬性 { get { return m_b; } set { m_b = value; } } abstract public double getresult(); //抽象方法,獲得結果 }
2.建立繼承抽象類的子類。
class ADDopterator : my_opterator //加法類
{
public override double getresult() //抽象方法的實現
{
return A + B;
}
}
class SUBoperator : my_opterator //減法類
{
public override double getresult() //抽象方法的實現
{
return A - B;
}
}
class MULopertator : my_opterator //乘法類
{
public override double getresult() //抽象方法的實現
{
return A * B;
}
}
class DIVoperator : my_opterator //除法類
{
public override double getresult() //抽象方法的實現
{
return A / B;
}
}
3.建立一個工廠,生成基於給定資訊的實體類的物件
class factory //簡單工廠類
{
private my_opterator m_opt;
public my_opterator createclass(string opt, double a, double b)
{
switch(opt)
{
case "+":
{
m_opt = new ADDopterator();
break;
}
case "-":
{
m_opt = new SUBoperator();
break;
}
case "*":
{
m_opt = new MULopertator();
break;
}
case "/":
{
m_opt = new DIVoperator();
break;
}
}
m_opt.A = a;
m_opt.B = b;
return m_opt;
}
}
4.使用該工廠,通過傳遞型別資訊來獲取實體類的物件。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 簡單工廠模式
{
class Program
{
static void Main(string[] args)
{
string A, B;
string opt;
Console.WriteLine("請輸入數字A:");
A = Console.ReadLine();
Console.WriteLine("請輸入運算子:");
opt = Console.ReadLine();
Console.WriteLine("請輸入數字B:");
B = Console.ReadLine();
my_opterator my_opt; //演算法類父類
factory fa = new factory(); //簡單工廠類
my_opt = fa.createclass(opt, Convert.ToDouble(A), Convert.ToDouble(B)); //呼叫生產演算法方法
Console.WriteLine(my_opt.getresult());
}
}
}
從上面程式碼可以發現:系統難以擴充套件,一旦新增新產品就不得不修改簡單工廠方法,這樣就會造成簡單工廠的實現邏輯過於複雜。
整合後的程式碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 簡單工廠模式
{
class Program
{
static void Main(string[] args)
{
string A, B;
string opt;
Console.WriteLine("請輸入數字A:");
A = Console.ReadLine();
Console.WriteLine("請輸入運算子:");
opt = Console.ReadLine();
Console.WriteLine("請輸入數字B:");
B = Console.ReadLine();
my_opterator my_opt; //演算法類父類
factory fa = new factory(); //簡單工廠類
my_opt = fa.createclass(opt, Convert.ToDouble(A), Convert.ToDouble(B)); //呼叫生產演算法方法
Console.WriteLine(my_opt.getresult());
}
}
}
class factory //簡單工廠類
{
private my_opterator m_opt;
public my_opterator createclass(string opt, double a, double b)
{
switch(opt)
{
case "+":
{
m_opt = new ADDopterator();
break;
}
case "-":
{
m_opt = new SUBoperator();
break;
}
case "*":
{
m_opt = new MULopertator();
break;
}
case "/":
{
m_opt = new DIVoperator();
break;
}
}
m_opt.A = a;
m_opt.B = b;
return m_opt;
}
}
abstract class my_opterator //演算法類父類
{
private double m_a, m_b;
public double A //A屬性
{
get { return m_a; }
set { m_a = value; }
}
public double B //B屬性
{
get { return m_b; }
set { m_b = value; }
}
abstract public double getresult(); //抽象方法,獲得結果
}
class ADDopterator : my_opterator //加法類
{
public override double getresult() //抽象方法的實現
{
return A + B;
}
}
class SUBoperator : my_opterator //減法類
{
public override double getresult() //抽象方法的實現
{
return A - B;
}
}
class MULopertator : my_opterator //乘法類
{
public override double getresult() //抽象方法的實現
{
return A * B;
}
}
class DIVoperator : my_opterator //除法類
{
public override double getresult() //抽象方法的實現
{
return A / B;
}
}