简单工厂
前言:设计模式不是具体的某项技术,它是优雅地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 }
运行结果
没错。简单工厂就这么简单。