一、简单工厂
专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
public interface ICar { void run(); } public class BMWCar : ICar { public void run() { Console.WriteLine("BMWCar run"); } } public class BenzCar : ICar { public void run() { Console.WriteLine("BenzCar run"); } } public class Driver { public static ICar DriverCar(string carType) { switch (carType) { case "BMWCar": return new BMWCar(); case "BenzCar": return new BenzCar(); default: throw new Exception(); } } } public class Client { public static void Main() { ICar myCar = Driver.DriverCar("BenzCar"); myCar.run(); Console.Read(); }
优点:只要实现共有的接口就可以实现不同车跑的方式.
缺点:添加新车型,需要修改Driver 类
二、工厂方法
工厂方法模式是对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类或者接口),这个类将不在负责具体的产品生产,而是制定一些规范,具体的生产工作由其子类去完成。
using System; public interface ICar { void run(); } public class BMWCar : ICar { public void run() { Console.WriteLine("BMWCar run"); } } public class BenzCar : ICar { public void run() { Console.WriteLine("BenzCar run"); } } public abstract class Driver { public abstract ICar DriverCar(); } public class BMWDriver : Driver { public override ICar DriverCar() { return new BMWCar(); } } public class BenzDriver : Driver { public override ICar DriverCar() { return new BenzCar(); } } class Client { public static void Main() { Driver myDriver = new BenzDriver(); ICar myCar = myDriver.DriverCar(); myCar.run(); Console.Read(); } }
该模式的优点是符合了开放-封闭原则(OCP),能够任意增加新的具体产品类。
三、抽象工厂方法
有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例
using System; public interface IBusinessCar { void run(); } public interface ISportCar { void run(); } public class BMWBusinessCar : IBusinessCar { public void run() { Console.WriteLine("BMWCar run"); } } public class BenzBusinessCar : IBusinessCar { public void run() { Console.WriteLine("BenzBusinessCar run"); } } public class BMWSportCar:ISportCar { public void run() { Console.WriteLine("BMWSportCar run"); } } public class BenzSportCar:ISportCar { public void run() { Console.WriteLine("BenzSportCar run"); } } public interface IDriver { IBusinessCar BusinessCarDriver(); ISportCar SportCarDriver(); } public class BMWDriver:IDriver { public IBusinessCar BusinessCarDriver() { return new BMWBusinessCar(); } public ISportCar SportCarDriver() { return new BMWSportCar(); } } public class BenzDriver:IDriver { public IBusinessCar BusinessCarDriver() { return new BenzBusinessCar(); } public ISportCar SportCarDriver() { return new BenzSportCar(); } } class Client { public static void Main() { IDriver myDriver =new BenzDriver(); ISportCar myCar = myDriver.SportCarDriver(); myCar.run(); Console.Read(); } }
总结:
工厂方法只有一个抽象产品类,而抽象工厂可以有多个。
工厂方法的具体工厂类只创建一个具体产品类的实例,而抽象工厂的具体工厂可以创建多个。
重点:模式的条条框框区别都是次要的,最重要的是领悟思想、结合实际、活用规则!