简单工厂

前言:设计模式不是具体的某项技术,它是优雅地coding的内功心法。我在设计模式的路上走走停停,总结出很重要的学习方法:慢慢品尝,联想下做过的项目,在哪里可以应用上来。

工厂模式简直不能算设计模式。因为有了继承后。简单工厂是自然而然的做法。听说Gof的23种设计模式也没有它,但是入门的好契机。

先来准备个宠物世界

    public abstract class PetInfo
    {
        public abstract void Feed();
        
    }

    public class DogInfo : PetInfo
    {
        public override void Feed()
        {
            Console.WriteLine("我在吃骨头?别搞笑,狗其实不怎么喜欢吃骨头的。拿狗粮来!");
        }
    }
    public class CatInfo : PetInfo
    {
        public override void Feed()
        {
            Console.WriteLine("自我感觉是上帝,来包上好的猫粮!");
        }
    }

这是多么简单的世界。多么简单的代码。刚学面向对象继承的时候,就知道这么写 父类 实例名=new 子类(参数);如

PetInfo pet1 = new DogInfo();
PetInfo pet2 = new CatInfo();

就这样,面向对象的一些基本思想出来了,这个实例创建后,我们并不需要下后面关心它是猫是狗,我们只关注它有父类约束的方法:Feed()。在这基础上,有个矛盾点是,后面的coding的确不需要关心它具体是什么宠物,但那个new DogInfo()是铁一样的事实写在那里啊。那么这样写,实际上并卵。脑子转一下就能想到,这个new 子类的代码,抽离放在一个方法里不就行了嘛。这个方法,就是工厂,一个简单的new出实例的方法,因此这个方法得名叫工厂,因为做法简单吧,所以叫简单工厂。上完整代码

 1 using System;
 2 
 3 namespace 简单工厂
 4 {
 5     public abstract class PetInfo
 6     {
 7         public abstract void Feed();
 8     }
 9 
10     public class DogInfo : PetInfo
11     {
12         public override void Feed()
13         {
14             Console.WriteLine("我在吃骨头?别搞笑,狗其实不怎么喜欢吃骨头的。拿狗粮来!");
15         }
16     }
17     public class CatInfo : PetInfo
18     {
19         public override void Feed()
20         {
21             Console.WriteLine("自我感觉是上帝,来包上好的猫粮!");
22         }
23     }
24 
25     public class Facoty
26     {
27         /// <summary>
28         /// 这里就是简单工厂的核心了。根据个petType,返回不同的子类
29         /// </summary>
30         public static PetInfo CreatePetFactory(string PetType)
31         {
32             switch (PetType)
33             {
34                 case "dog":
35                     return new DogInfo();
36                 case "cat":
37                     return new CatInfo();
38                 default:
39                     return null;
40             }
41         }
42     }
43 
44     class Program
45     {
46 
47         static void Main(string[] args)
48         {
49             Console.WriteLine("你想作铲屎官吗?可以输入cat 或 dog");
50             string PetType = Console.ReadLine();
51             PetInfo info = Facoty.CreatePetFactory(PetType);
52             if (null!=info)
53             {
54                 info.Feed();
55             }
56             Console.ReadLine();
57         }
58     }
59 }

运行结果

 

没错。简单工厂就这么简单。

 

posted @ 2017-03-07 22:22  小猪夏盈  阅读(148)  评论(0编辑  收藏  举报