1.工厂方法模式概念

工厂方法模式(Factory Method) : 定义一个用于创建对象的接口,让子类决定实例化了哪个类。工厂方法使一个类的实例化延迟到其子类。 用于生产同一等级结构中的固定产品。(支持增加任意产品)

特点:(1)工厂方法模式是简单工厂模式的进一步抽象和推广 。

           (2) 使用了多态性,工厂方法模式保持了简单工厂模式的优点,克服了它缺点。 

      又叫多态性工厂模式(Polymorpic Factory Pattern),它由四种角色组成(关系见下面的类图):

     1、抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
     2、具体工厂(Concrete Creator)角色:该角色实现了抽象工厂接口,含有与应用相关的逻辑,并且受到应用程序的调用,以创建产品对象。 
     3、抽象产品(Product)角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。                                          4、具体产品(Concrete Product)角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

     还是上次那个例子(上一篇JAVA简单工厂模式),奥迪和比亚迪的跑法。哈哈,比亚迪可以逆天么?

2.  UML图。

3. 具体代码

   (1)抽象工厂


 

1. public interface CarFactory{
2. public Car CreateCar();
3. //更多其他逻辑.....
4. }

       奥迪工厂:实现CarFactory接口,是一个用于生产 奥迪的具体工厂


 

1. public class AudiFactory implements CarFactory {
2. //创建者
3. @Override
4. public Car CreateCar() {
5. return new AuDi();//返回奥迪给ClientFactoryMethod
6. //更多逻辑
7. }
8. }

      比亚迪工厂:实现CarFactory接口,是一个用于生产比亚迪的具体工厂


 

1. public class BYDFactory implements CarFactory {
2. //创建者
3. @Override
4. public Car CreateCar() {
5. return new BYD();//返回比亚迪给ClientFactoryMethod
6. //更多逻辑
7. }
8. }

   (3)抽象产品


 

1. <span style="font-weight: normal;"> //抽象产品角色 
2. public interface Car { 
3. public void run(); //更多具体逻辑....... 
4. } </span>

         奥迪产品: 实现Car接口,是一个具体的产品


 

1. //具体产品奥迪 </span> 
2. public class AuDi implements Car{ 
3. @Override 
4. public void run() { 
5. System.out.println("奥迪跑起来了"); 
6. } //更多具体逻辑...... 
7. } 

        比亚迪产品: 实现Car接口,是一个具体的产品

 

1. //具体产品比亚迪 public class BYD implements Car{ 
2. @Override 
3. public void run() { 
4. System.out.println("比亚迪跑起来了"); }
5. } 

      测试:


 

1. //工厂方法模式
2. public class ClientFactoryMethod {//客户端
3. //调用者
4. public static void main(String[] args) {
5. Car audi=new AudiFactory().CreateCar();//通过具体的工厂创建产品
6. Car byd=new BYDFactory().CreateCar();
7. //车跑
8. audi.run();
9. byd.run(); 
10. }
11. }

4.小结

工厂方法模式的优点:

1.良好的封装性,代码结构清晰。创建产品时只要知道这个产品的类名或约束字符串就可以,不用知道创建的过程,降低了板块间的耦合。

2.优秀的可拓展性。 在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以适应变化。 如要新增加奔驰benz,只要新建一个奔驰产品: 实现Car接口奔驰工厂:实现CarFactory接口,就行了。

3.屏蔽产品类,产品类如何实现如何变化,调用者不用关心,只需关心产品的接口,只要接口保持不变,系统的上层模版就不会发生变化。

4.工厂方法模式是典型的解耦框架,符合迪米特法则,也符合依赖倒置原则,还符合里氏替换原则。

迪米特法则:又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。

依赖倒置原则:A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

里氏替换原则:OCP作为OO的高层原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性。“抽象”是语言提供的功能。“多态”由继承语义实现。
工厂模式在项目中使用的非常频繁,在很多框架的代码中都可以发现它的应用。