简单工厂模式

简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类.因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于创建型模式.

简单工厂模式的要点在于:​当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无需知道其创建细节


工厂方法模式

工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类.工厂方法模式又简称为工厂模式(Factory Pattern),又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern).工厂方法模式是一种创建型模式.

在工厂方法模式中,​不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构.


抽象工厂模式

抽象工厂模式(abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象接口,而无须指定它们具体的类.抽象工厂模式又称Kit模式,它是一种对象创建模式.

抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形式.抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是​一个产品等级结构​,而抽象工厂模式需要面对​多个产品等级结构​,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建.当一个工厂等级结构可以创建出分属不同产品等级的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单,更有效率.

class Program
{
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 studnet3 = new Undergraduate();
studnet3.Wash();

//简单工厂模式
LeiFeng studentA = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
studentA.BuyRice();
LeiFeng studetnB = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
studetnB.Sweep();
LeiFeng studnetC = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
studnetC.Wash();

//工厂方法模式
IFactory factory = new UndergraduateFactory();
LeiFeng student = factory.CreateLeiFeng();

student.BuyRice();
student.Sweep();
student.Wash();
Console.Read();


}
}
//雷锋
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();
}
}