笔记来源《深入浅出设计模式(中文版)》。
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
- 工厂方法模式的概念
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
你应该大致猜出了工厂方法模式的结构,来看下它的组成:
1) 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java 中它由抽象类或者接口来实现。
2) 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3) 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在 java 中一般有抽象类或者接口来实现。
4) 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在 java 中由具体的类来实现。 - 结合实例代码理解
- 实例:
话说十年前,有一个暴发户,他家有三辆汽车——Benz 奔驰、Bmw 宝马、Audi 奥迪,还雇了司机为他开车。不过,暴发户坐车时总是怪怪的:上Benz 车后跟司机说“开奔驰车!”,
坐上Bmw 后他说“开宝马车!”,坐上Audi 说“开奥迪车!”。我们以工厂模式来改造暴发户坐车的方式——现在暴发户只需要坐在车里对司机说句:“开车”就可以了。
- 实例:
1 //抽象工厂角色 2 public interface ICar 3 { 4 void Drive(); 5 } 6 class BenchiCar:ICar 7 { 8 public void Drive() 9 { 10 Console.WriteLine("Driving BenchiCar"); 11 } 12 } 13 class BmwCar : ICar 14 { 15 public void Drive() 16 { 17 Console.WriteLine("Driving BMW Car"); 18 } 19 } 20 #region 工厂方法模式 21 public interface IDriver 22 { 23 ICar DiverCar(); 24 } 25 public class BenchiDriver : IDriver 26 { 27 public ICar DiverCar() 28 { 29 return new BenchiCar(); 30 } 31 } 32 public class BmwDriver : IDriver 33 { 34 public ICar DiverCar() 35 { 36 return new BmwCar(); 37 } 38 } 39 40 #endregion
-
- 客户端实现代码如下
1 Driver driver = new BenzDriver(); 2 Car car = driver.driverCar(); 3 car.drive();
- 同例用简单工厂模式实现的代码如下
1 //抽象工厂角色 2 public interface ICar 3 { 4 void Drive(); 5 } 6 class BenchiCar:ICar 7 { 8 public void Drive() 9 { 10 Console.WriteLine("Driving BenchiCar"); 11 } 12 } 13 class BmwCar : ICar 14 { 15 public void Drive() 16 { 17 Console.WriteLine("Driving BMW Car"); 18 } 19 } 20 #region 简单工厂模式 21 class CarFactory 22 { 23 public static ICar CreateICar(string carType) 24 { 25 if (carType.Substring(0, 3).ToUpper() == "BEN")//暂时处理方法 26 { 27 return new BenchiCar(); 28 } 29 else 30 { 31 return new BmwCar(); 32 } 33 } 34 } 35 #endregion
-
- 客户端实现代码
1 Car car = Driver.driverCar("benchi"); 2 car.drive();