工厂方法模式,就是使一个类的实例化延迟到子类——惰性声明
UML图如下:
public class Production { }
public abstract class Creator
{
public abstract Production FactoryMathod();
}
public class ConcreteCreator : Creator
{
public override Production FactoryMathod()
{
return new Production();
}
}
public abstract class Creator
{
public abstract Production FactoryMathod();
}
public class ConcreteCreator : Creator
{
public override Production FactoryMathod()
{
return new Production();
}
}
工厂方法模式无处不在,创建型模式都是依赖于工厂模式的。
简单工厂Simple Factory,这是工厂方法模式的一个特例,因为该模式是通过switch分支(也有用if判断的),来决定最终生成哪一个对象的,而这个switch分支语句,嵌在一个静态方法中,这个改装就是简单工厂。
public abstract class A
{
public abstract void Do();
}
public class A1 : A
{
public override void Do()
{
Console.WriteLine("A1");
}
}
public class A2 : A
{
public override void Do()
{
Console.WriteLine("A2");
}
}
public class CreateA
{
public static A CreateAFactory(int type)
{
switch(type)
{
case 1:
return new A1();
break;
case 2:
default:
return new A2();
break;
}
}
}
{
public abstract void Do();
}
public class A1 : A
{
public override void Do()
{
Console.WriteLine("A1");
}
}
public class A2 : A
{
public override void Do()
{
Console.WriteLine("A2");
}
}
public class CreateA
{
public static A CreateAFactory(int type)
{
switch(type)
{
case 1:
return new A1();
break;
case 2:
default:
return new A2();
break;
}
}
}
在Client端,只要使用 CreateA.CreateAFactory(1).Do(); 就可以生成需要的对象
简单工厂的缺点是,一旦增加新产品类,同时要实现抽象类中的所有方法;还有,一旦要修改抽象类中的方法,所有子类都要变动——扩展性差,不符合开闭原则。
另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。