工厂方法用来出来对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码和子类对象对象的创建代码解耦了。
工厂方法模式定义了一个创建对象的接口,但有子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
把产品和工厂分隔开,都是针对产品接口进行编程。
我们举个例子,使用工厂创建汽车。
首先创建一个汽车产品接口
public interface car
{
void makeCar();
void dirveCar();
}
然后创建具体的汽车产品
public class QIYA : car
{
public void dirveCar()
{
Console.WriteLine("开起亚汽车");
}
public void makeCar()
{
Console.WriteLine("制作起亚汽车");
}
}
public class xiandai : car
{
public void dirveCar()
{
Console.WriteLine("开现代汽车");
}
public void makeCar()
{
Console.WriteLine("制造现代汽车");
}
}
然后创建产品工厂超类,里面定义具体对产品的操作行为
public abstract class useCar
{
//定义产品
public car car;
public void use()
{
car.makeCar();
car.dirveCar();
}
}
定义具体的产品工厂
public class QIYAFactory:useCar
{
public QIYAFactory()
{
base.car = new QIYA();
}
}
public class XIANDAIFcatory : useCar
{
public XIANDAIFcatory()
{
car = new xiandai();
}
}
测试
useCar useCar = new QIYAFactory();
useCar.use();
useCar = new XIANDAIFcatory();
useCar.use();
输出
制作起亚汽车
开起亚汽车
制造现代汽车
开现代汽车
如果我们再要创建一个丰田汽车产品和工厂的话,需要增加两个地方
public class toyto : car
{
public void dirveCar()
{
Console.WriteLine("开丰田汽车");
}
public void makeCar()
{
Console.WriteLine("制作丰田汽车");
}
}
public class toytoFactory : useCar
{
public toytoFactory()
{
car = new toyto();
}
}
如果使用的话,也需要同步初始这个工厂
static void Main(string[] args)
{
useCar useCar = new QIYAFactory();
useCar.use();
useCar = new XIANDAIFcatory();
useCar.use();
useCar = new toytoFactory();
useCar.use();
Console.ReadLine();
}
可以看出,使用工厂方法创建的类,是比较繁琐的。