简介:
工厂模式有三种,分别是简单工厂、工厂方法、抽象工厂。
简单工厂 | 简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,例如case或者if-else等。没有抽象工厂类,仅有产品抽象。简单工厂模式缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化越多,里面的case或者if-else等也越多,这样就会造成简单工厂的实现逻辑过于复杂。这样的修改也是不符合【开放关闭原则OCP】,对修改代码关闭,对增加代码开放。 |
工厂方法 | 工厂方法模式是解决单个对象的需求变化,即仅有一个抽象产品类,可以有多个继承抽象产品类和抽象工厂类。每个继承工厂类仅有一个继承产品类的实例。如果新增产品,需要新增继承产品抽象类、继承工厂抽象类。 |
抽象工厂 | 抽象工厂模式是结果对于多个对象的需求变化,即可有多个产品抽象类。每个继承工厂类有多个继承产品类的实例。如果新增产品,需要新增抽象工厂类、继承工厂抽象类、产品抽象类、继承产品抽象类。 |
介绍:


使用:
1.简单工厂
//工厂类
public class Factory
{
public static IDraw GetDraw(string type)
{
IDraw draw = null;
switch (type)
{
case "Square": draw = new SquareDraw(); break;
case "Circle": draw = new CircleDraw(); break;
default: break;
}
return draw;
}
}
//抽象产品类
public abstract class IDraw
{
public abstract void Draw();
}
//继承产品类
public class SquareDraw : IDraw
{
public override void Draw()
{
//do something
}
}
//继承产品类
public class CircleDraw : IDraw
{
public override void Draw()
{
//do something
}
}
//简单工厂调用
IDraw draw = Factory.GetDraw("Square");
raw.Draw();
draw = Factory.GetDraw("Circle");
draw.Draw();
2.工厂方法
//抽象工厂类
public abstract class IFactory
{
public abstract IDraw GetDraw();
}
//继承工厂抽象类
public class SquareFactory:IFactory
{
public override IDraw GetDraw()
{
IDraw draw = new SquareDraw();
return draw;
}
}
//继承工厂抽象类
public class CircleFactory : IFactory
{
public override IDraw GetDraw()
{
IDraw draw = new CircleDraw();
return draw;
}
}
//产品抽象类
public abstract class IDraw
{
public abstract void Draw();
}
//继承产品抽象类
public class SquareDraw : IDraw
{
public override void Draw()
{
//do something
}
}
//继承产品抽象类
public class CircleDraw : IDraw
{
public override void Draw()
{
//do something
}
}
//工厂方法调用
IFactory fact = new SquareFactory();
IDraw draw = fact.GetDraw();
draw.Draw();
fact = new CircleFactory();
draw = fact.GetDraw();
draw.Draw();
3.抽象工厂
//抽象工厂类
public abstract class IFactory
{
//产品的抽象方法
public abstract IDraw GetDraw();
public abstract IPrint GetPrint();
}
//继承工厂类
public class SquareFactory : IFactory
{
//产品类的实例
public override IDraw GetDraw()
{
IDraw draw = new SquareDraw();
return draw;
}
//产品类的实例
public override IPrint GetPrint()
{
IPrint print = new SquarePrint();
return print;
}
}
//继承工厂类
public class CircleFactory : IFactory
{
public override IDraw GetDraw()
{
IDraw draw = new CircleDraw();
return draw;
}
public override IPrint GetPrint()
{
IPrint print = new CirclePrint();
return print;
}
}
//抽象产品类
public abstract class IDraw
{
public abstract void Draw();
}
//继承产品类
public class SquareDraw : IDraw
{
public override void Draw()
{
//do something
}
}
//继承产品类
public class CircleDraw : IDraw
{
public override void Draw()
{
//do something
}
}
//抽象产品类
public abstract class IPrint
{
public abstract void Print();
}
//继承产品类
public class SquarePrint : IPrint
{
public override void Print()
{
//do something
}
}
//继承产品类
public class CirclePrint : IPrint
{
public override void Print()
{
//do something
}
}
//抽象工厂调用
IFactory fact = new SquareFactory();
fact.GetDraw();
fact.GetPrint();
fact = new CircleFactory();
fact.GetDraw();
fact.GetPrint();