【工厂模式】
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类
【介绍】
-
主要解决:接口选择的问题
-
何时使用:明确的计划不同条件下创建不同实例时
-
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品
-
关键代码:创建过程在其子类执行
-
优点:一个调用者想创建一个对象,只要知道名称就行;扩展性高:如果想增加一个产品,只要扩展一个工厂类就可以了;屏蔽产品的具体实现,调用者只关心产品的接口
-
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍的增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖
-
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式,复杂对象适合使用工厂模式,简单对象只需要通过new就可以完成创建的对象,无需使用工厂模式。
【实现】

步骤一:雷锋类
class LeiFeng
{
public void Sweep()
{
Console.WriteLine("扫地");
}
public void Wash()
{
Console.WriteLine("洗衣");
}
public void BuyRice()
{
Console.WriteLine("买米");
}
}
步骤二:创建实现接口的实体类
//学雷锋的大学生
class Undergraduate : LeiFeng
{ }
//社区志愿者
class Volunteer : LeiFeng
{ }
步骤三:工厂类
//简单雷锋工厂
class SimpleFactory
{
public static LeiFeng CreateLeiFeng(string type)
{
LeiFeng result = null;
switch (type)
{
case "学雷锋的大学生":
result = new Undergraduate();
break;
case "社区志愿者":
result = new Volunteer();
break;
}
return result;
}
}
//雷锋工厂
interface IFactory
{
LeiFeng CreateLeiFeng();
}
//学雷锋的大学生工厂
class UndergraduateFactory : IFactory
{
public LeiFeng CreateLeiFeng()
{
return new Undergraduate();
}
}
//社区志愿者工厂
class VolunteerFactory : IFactory
{
public LeiFeng CreateLeiFeng()
{
return new Volunteer();
}
}
步骤四:客户端代码
static void Main(string[] args)
{
LeiFeng xueleifeng = new Undergraduate();
xueleifeng.BuyRice();
xueleifeng.Sweep();
xueleifeng.Wash();
LeiFeng student1 = new Undergraduate();
student1.BuyRice();
LeiFeng student2 = new Undergraduate();
student2.Sweep();
LeiFeng student3 = new Undergraduate();
student3.Wash();
//简单工厂模式
LeiFeng studentA = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
studentA.BuyRice();
LeiFeng studentB = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
studentB.Sweep();
LeiFeng studentC = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
studentC.Wash();
//工厂方法模式
IFactory factory = new UndergraduateFactory();
LeiFeng student = factory.CreateLeiFeng();
student.BuyRice();
student.Sweep();
student.Wash();
Console.Read();
}
【总结】
一、三者之间的区分
简单工厂:一个工厂类,一个产品抽象类。
工厂方法:多个工厂类,一个产品抽象类。
抽象工厂:多个工厂类,多个产品抽象类。
二、生活中的工厂模式
简单工厂类:一个麦当劳店,可以生产多种汉堡。
工厂方法类:一个麦当劳店,可以生产多种汉堡。一个肯德基店,也可以生产多种汉堡。
抽象工厂类:百胜餐饮集团下有肯德基和百事公司,肯德基生产汉堡,百事公司生成百事可乐。
|