一:簡單工廠模式 1:描述:簡單工廠模式是由一個工廠對象根據接收到的消息決定要創建哪一個類的對象事例。 2:優點:工廠類中有相關邏輯判斷,可以根據需要動態創建相關的對象事例,而客戶端只需要告訴工廠類創建什麼對象事例,而不關心怎麼創建,當需要引入新產品就不需要修改客戶端的代碼,只需要添加相應的產品類並 ...
一:簡單工廠模式
1:描述:簡單工廠模式是由一個工廠對象根據接收到的消息決定要創建哪一個類的對象事例。
2:優點:工廠類中有相關邏輯判斷,可以根據需要動態創建相關的對象事例,而客戶端只需要告訴工廠類創建什麼對象事例,而不關心怎麼創建,當需要引入新產品就不需要修改客戶端的代碼,只需要添加相應的產品類並修改工廠類就可以,所以從產品的角度上簡單工廠模式是符合“開-閉”原則的。
3:缺點:很容易違反高內聚低耦合的原則,一旦添加新產品就不得不修改工廠邏輯,當產品類型較多時,有可能造成工廠邏輯比較複雜,不利於系統的擴展和維護,所以從工廠的角度來說簡單工廠模式是不符合“開-閉”原則的。
4:例子:
namespace SimpleFactoryDemo
{
class Program
{
static void Main(string[] args)
{
ShapeFactory shapeFactory = new ShapeFactory();
shapeFactory.getShape("circle").draw();
shapeFactory.getShape("rectangle").draw();
shapeFactory.getShape("square").draw();
Console.ReadKey();
}
}
public interface IShape
{
void draw();//預設公共方法
}
public class Circle : IShape
{
public void draw()
{
Console.WriteLine("畫個圓");
}
}
public class Rectangle : IShape
{
public void draw()
{
Console.WriteLine("畫個長方形");
}
}
public class Square : IShape
{
public void draw()
{
Console.WriteLine("畫個正方形");
}
}
public class ShapeFactory//形狀工廠
{
public IShape getShape(string type)
{
if ("circle".Equals(type))
{
return new Circle();
}
else if ("rectangle".Equals(type))
{
return new Rectangle();
}
else if ("square".Equals(type))
{
return new Square();
}
else
{
return null;
}
}
}
}
二:工廠模式
1:描述:定義一個創建對象的工廠介面,讓子類決定實例化哪個類,將實際創建工作推遲到子類中。
2:優點:創建對象的介面,讓子類決定具體實例化的對象,把簡單的內部邏輯移動到客戶端,工廠方法剋服了簡單工廠所違背的的開閉原則的缺點,擴展性高,易於維護,想要增加一個產品,只需要增加一個工廠類即可。
3:例子:
namespace FactoryDemo
{
class Program
{
static void Main(string[] args)
{
IShapeFactory circleFactory = new CircleFactory();
circleFactory.getShape().draw();
IShapeFactory rectangleFactory = new RectangleFactory();
rectangleFactory.getShape().draw();
IShapeFactory squareFactory = new SquareFactory();
squareFactory.getShape().draw();
Console.ReadKey();
}
}
public interface IShape
{
void draw();//預設公共方法
}
public class Circle : IShape
{
public void draw()
{
Console.WriteLine("畫個圓");
}
}
public class Rectangle : IShape
{
public void draw()
{
Console.WriteLine("畫個長方形");
}
}
public class Square : IShape
{
public void draw()
{
Console.WriteLine("畫個正方形");
}
}
public interface IShapeFactory//形狀工廠介面
{
IShape getShape();
}
public class CircleFactory : IShapeFactory
{
public IShape getShape()
{
return new Circle();
}
}
public class RectangleFactory : IShapeFactory
{
public IShape getShape()
{
return new Rectangle();
}
}
public class SquareFactory : IShapeFactory
{
public IShape getShape()
{
return new Square();
}
}
}
三:抽象工廠模式
1:描述:提供一個創建一系列相關或相互依賴對象的介面,而無需指定他們具體的類。
2:優點:(1):當一個產品族中的多個對象被設計在一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
(2):具有工廠方法模式解耦的優點。
(3):工廠方法模式針對的是一個產品等級結構,抽象工廠模式針對的是面向多個產品等級結構,最主要的是可以在類的內部對產品族的關聯關係進行定義和描述。
3:例子:以生產兩款車子為例,一個工廠生產寶馬和比亞迪兩款汽車,同時生產國產和進口兩種發動機。
namespace AbstractFactoryDemo
{
class Program
{
static void Main(string[] args)
{
IFactory carAFactory = new CarA();
carAFactory.ProductCar().ProductCar();
carAFactory.ProductEngine().ProductEngine();
IFactory carBFactory = new CarB();
carBFactory.ProductCar().ProductCar();
carBFactory.ProductEngine().ProductEngine();
Console.ReadKey();
}
}
public interface ICarFactory
{
void ProductCar();
}
public class BMWCar: ICarFactory
{
public void ProductCar()
{
Console.Write("寶馬汽車:");
}
}
public class BYDCar : ICarFactory
{
public void ProductCar()
{
Console.Write("比亞迪汽車:");
}
}
public interface IEngineFactory
{
void ProductEngine();
}
public class DomesticEngine : IEngineFactory
{
public void ProductEngine()
{
Console.WriteLine("國產發動機");
}
}
public class ImportEngine : IEngineFactory
{
public void ProductEngine()
{
Console.WriteLine("進口發動機");
}
}
public interface IFactory
{
ICarFactory ProductCar();
IEngineFactory ProductEngine();
}
public class CarA : IFactory//寶馬汽車,進口發電機
{
public ICarFactory ProductCar()
{
return new BMWCar();
}
public IEngineFactory ProductEngine()
{
return new ImportEngine();
}
}
public class CarB : IFactory//比亞迪汽車,國產發電機
{
public ICarFactory ProductCar()
{
return new BYDCar();
}
public IEngineFactory ProductEngine()
{
return new DomesticEngine();
}
}
}
四:總結
1:無論是簡單工廠模式,工廠模式,還是抽象工廠模式,他們都屬於工廠模式,在形式和特點上都極為相似,他們的最終目的都是為瞭解耦,所以在實際開發中靈活運用工廠模式,達到降低耦合度的目的。