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()的;不知道我的理解是不是错误,忘各位解惑

解决方案 »

  1.   

    IFactory中声明一个 GetMarried 返回 IHuman 实例,子工厂都通过 GetMarried 创建一个IHuman 实例
      

  2.   

    真是一语惊醒梦中人。IFactory中的IHuman GetMarried();就相当于 int paramA(定义了一个int类型的参数paramA),只不过这个GetMarried()返回的是IHuman这个模板的一个具体的对象,而下面的WomanFactory,ManFactory都继承这个工程,那么它们必将实现返回IHuman的对象,所以里面用了new Woman()/Man(),而Woman对象和Man对象都是继承于Human的。
      

  3.   

    你没明白的那句,你看看代码,是不是有N个类实现了接口IHuman?GetMarried方法可以根据具体的情况返回相应的类。
    你看看代码中,Man和Woman都实现了IHuman接口,这样我就不需针对Man类去写一个GetMarried方法,然后又去针对Woman又写一个GetMarried方法。是吧?现在实现IHuman的类只有两个,那如果我后面对程序进行扩展,我写了20个类都实现IHuman,难道我还要为他们各自编写一个GetMarried方法不成?
    接口的用途就像宪法一样,各地区可以根据宪法的规范,定义立法。所以接口的作用就是规范类设计的行为。好比快递员一样,他有一个规范的行为——把物件送到指定的地址人手里,而不管他送的是什么,有可以是一本书,一套餐具……
    抽象工厂所谓的抽象,就是从现实生活中的事物中逐级提取和总结,所以,我们往往写程序的次序和客观世界事物的抽象过程是相反的。
    比如,在客观事物进行抽象时,我们会这样做:
    西装、T恤…… -> 男装 -> 服装;
    而我们写程序的次序是:
    服装 -> 男装 -> 西装、T恤……