namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//ConsoleApplication1.ManFactory可以写到配置文件中,此处略
IFactory carFactory = CarFactory.CreateFacory("ConsoleApplication1.ManFactory");
IHuman hyman = carFactory.GetMarried();
hyman.Run(); Console.ReadKey();
} public class CarFactory
{
public static IFactory CreateFacory(string factoryType)
{
Type t = Type.GetType(factoryType);
return Activator.CreateInstance(t) as IFactory; //另一种方法创建实体工厂对象Assembly.Load(程序集名称).CreateInstance(命名空间.类名)
//IFactory carFactory = System.Reflection.Assembly.Load("ConsoleApplication1").CreateInstance(factoryType) as IFactory;
//return carFactory;
}
} public interface IFactory
{
IHuman GetMarried();
}
} public interface IHuman
{
void Run();
} public class Woman : IHuman
{
public Woman()
{
Console.WriteLine("The girl fall in love");
} public void Run()
{
Console.WriteLine("There is a girl in the running");
}
} public class Man : IHuman
{
public Man()
{
Console.WriteLine("The guy fall in love");
} public void Run()
{
Console.WriteLine("A guy with the girl behind");
}
} public class WomanFactory : Program.IFactory
{
public IHuman GetMarried()
{
return new Woman();
}
} public class ManFactory : Program.IFactory
{
public IHuman GetMarried()
{
return new Man();
}
}}其中对这一段还没明白
public interface IFactory
{
IHuman GetMarried();
}
这个IFactory工厂是个比较抽象的工厂,它用来生成另一种具体的工厂,这个过程可以理解为,IFactory其实为IHuman定义了GetMarried方法标准,本来IHuman 是只有Run()的;不知道我的理解是不是错误,忘各位解惑
你看看代码中,Man和Woman都实现了IHuman接口,这样我就不需针对Man类去写一个GetMarried方法,然后又去针对Woman又写一个GetMarried方法。是吧?现在实现IHuman的类只有两个,那如果我后面对程序进行扩展,我写了20个类都实现IHuman,难道我还要为他们各自编写一个GetMarried方法不成?
接口的用途就像宪法一样,各地区可以根据宪法的规范,定义立法。所以接口的作用就是规范类设计的行为。好比快递员一样,他有一个规范的行为——把物件送到指定的地址人手里,而不管他送的是什么,有可以是一本书,一套餐具……
抽象工厂所谓的抽象,就是从现实生活中的事物中逐级提取和总结,所以,我们往往写程序的次序和客观世界事物的抽象过程是相反的。
比如,在客观事物进行抽象时,我们会这样做:
西装、T恤…… -> 男装 -> 服装;
而我们写程序的次序是:
服装 -> 男装 -> 西装、T恤……