简单工厂
简单工厂模式的工厂类一般是使用静态方法,通过接收的参数不同来返回不同的对象实例。不修改代码的话,是无法扩展的
优点:客户端可以免除直接创建产品对象的责任,而仅仅是“消费”产品。简单工厂模式通过这种做法实现了对责任的分割
缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了
普通方法调用
1 /// <summary> 2 /// 玩家 3 /// </summary> 4 public class Player 5 { 6 public int Id { get; set; } 7 public string Name { get; set; } 8 9 public void PlayHuman(Human human) 10 { 11 Console.WriteLine("******************************"); 12 Console.WriteLine("This is {0} Play War3.{1}", this.Name, human.GetType().Name); 13 human.ShowKing(); 14 } 15 16 public void PlayORC(ORC orc) 17 { 18 Console.WriteLine("******************************"); 19 Console.WriteLine("This is {0} Play War3.{1}", this.Name, orc.GetType().Name); 20 orc.ShowKing(); 21 } 22 23 public void PlayORC(Undead undead) 24 { 25 Console.WriteLine("******************************"); 26 Console.WriteLine("This is {0} Play War3.{1}", this.Name, undead.GetType().Name); 27 undead.ShowKing(); 28 } 29 30 /// <summary> 31 /// 面向抽象 32 /// </summary> 33 /// <param name="race"></param> 34 public void PlayWar3(IRace race) 35 { 36 Console.WriteLine("******************************"); 37 Console.WriteLine("This is {0} Play War3.{1}", this.Name, race.GetType().Name); 38 race.ShowKing(); 39 } 40 41 42 }
1 /// <summary> 2 /// War3种族之一 3 /// </summary> 4 public class Human : IRace 5 { 6 public Human(int id, DateTime dateTime, string reamrk) 7 { } 8 public Human() 9 { } 10 11 public void ShowKing() 12 { 13 Console.WriteLine("The King of {0} is {1}", this.GetType().Name, "Sky"); 14 } 15 }
1 /// <summary> 2 /// War3种族之一 3 /// </summary> 4 public class ORC : IRace 5 { 6 public void ShowKing() 7 { 8 Console.WriteLine("The King of {0} is {1}", this.GetType().Name, "Grubby"); 9 } 10 }
1 /// <summary> 2 /// War3种族之一 3 /// </summary> 4 public class Undead : IRace 5 { 6 public void ShowKing() 7 { 8 Console.WriteLine("The King of {0} is {1}", this.GetType().Name, "GoStop"); 9 } 10 }
1 /// <summary> 2 /// War3种族之一 3 /// </summary> 4 public class NE : IRace 5 { 6 public void ShowKing() 7 { 8 Console.WriteLine("The King of {0} is {1}", this.GetType().Name, "Moon"); 9 } 10 }
1 Player player = new Player() 2 { 3 Id = 123, 4 Name = "候鸟" 5 }; 6 #region 7 { 8 Human human = new Human(); 9 player.PlayHuman(human); 10 } 11 { 12 ORC orc = new ORC(); 13 player.PlayORC(orc); 14 } 15 { 16 Undead undead = new Undead(); 17 player.PlayWar3(undead); 18 } 19 { 20 NE ne = new NE(); 21 player.PlayWar3(ne); 22 } 23 #endregion
优化第一步=> 面向对象 => 封装、继承=> 几个种族分别继承接口
1 public interface IRace 2 { 3 /// <summary> 4 /// show出王者 5 /// </summary> 6 void ShowKing(); 7 }
1 { 2 Human human = new Human();//1 到处都是细节 3 player.PlayWar3(human); 4 } 5 { 6 IRace human = new Human();//2 左边是抽象 右边是细节 7 player.PlayWar3(human); 8 }
想去细节 想去掉什么东西,咱们就封装一下 转移一下
1 public enum RaceType 2 { 3 Human, 4 Undead, 5 ORC, 6 NE 7 }
1 /// <summary> 2 /// 细节没有消失 只是转移 3 /// 转移了矛盾,并没有消除矛盾 4 /// 5 /// 集中了矛盾 6 /// </summary> 7 /// <param name="raceType"></param> 8 /// <returns></returns> 9 public static IRace CreateRace(RaceType raceType) 10 { 11 IRace iRace = null; 12 switch (raceType) 13 { 14 case RaceType.Human: 15 iRace = new Human(); 16 break; 17 case RaceType.Undead: 18 iRace = new Undead(); 19 break; 20 case RaceType.ORC: 21 iRace = new ORC(); 22 break; 23 case RaceType.NE: 24 iRace = new NE(); 25 break; 26 //增加一个分支 27 default: 28 throw new Exception("wrong raceType"); 29 } 30 return iRace; 31 }
前端调用
1 { 2 IRace human = ObjectFactory.CreateRace(RaceType.Human); //new IRace();// //new Human();//3 没有细节 细节被转移 3 player.PlayWar3(human); 4 } 5 { 6 IRace undead = ObjectFactory.CreateRace(RaceType.Undead); //new Human();//3 没有细节 细节被转移 7 player.PlayWar3(undead); 8 }
这样简单工厂就出来了,但是这种方法并没有取消细节,而是集中了矛盾,每改一个类都有可能需要修改CreateRace方法,这种方法违反了低耦合的原则
有什么方法可以优化一下吗,
怎么同时生成两个不同的种族?
一个方法 不要参数 可能创建不同类型的实例吗
那只能传参数 传一个human 结果可能是Human 也可以是Undead
把传递的参数 放入到配置文件 可配置的
1 private static string IRacTypeConfig = ConfigurationManager.AppSettings["IRacTypeConfig"];//IRacTypeConfig+参数 2 public static IRace CreateRaceConfig() 3 { 4 RaceType raceType = (RaceType)Enum.Parse(typeof(RaceType), IRacTypeConfig); 5 return CreateRace(raceType); 6 }
前端调用
1 Console.WriteLine("*********************CreateRaceConfig*****************"); 2 { 3 IRace undead = ObjectFactory.CreateRaceConfig(); //new Human();//4 可配置 4 player.PlayWar3(undead); 5 }
如果拓展了新种族
1 //1 方法增加个参数 2 //2 给不同的参数,配置不同的IRacTypeConfigReflection 3 4 //多方法是不对的,因为没法扩展新种族 5 //泛型也不对 泛型需要上端知道具体类型 6 7 private static string IRacTypeConfigReflection = ConfigurationManager.AppSettings["IRacTypeConfigReflection"]; 8 private static string DllName = IRacTypeConfigReflection.Split(',')[1]; 9 private static string TypeName = IRacTypeConfigReflection.Split(',')[0]; 10 /// <summary> 11 /// ioc的雏形 可配置可扩展的 12 /// </summary> 13 /// <returns></returns> 14 public static IRace CreateRaceConfigReflection() 15 { 16 Assembly assembly = Assembly.Load(DllName); 17 Type type = assembly.GetType(TypeName); 18 IRace iRace = Activator.CreateInstance(type) as IRace; 19 20 return iRace; 21 }
前端调用
1 { 2 IRace undead = ObjectFactory.CreateRaceConfigReflection(); //5 可配置可扩展 3 player.PlayWar3(undead); 4 }