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)抽象工厂
-
public interface CarFactory{
-
public Car CreateCar();
-
//更多其他逻辑.....
-
}
(2)具体工厂
奥迪工厂:实现CarFactory接口,是一个用于生产 奥迪的具体工厂
-
public class AudiFactory implements CarFactory {
-
//创建者
-
@Override
-
public Car CreateCar() {
-
return new AuDi();//返回奥迪给ClientFactoryMethod
-
//更多逻辑
-
}
-
}
比亚迪工厂:实现CarFactory接口,是一个用于生产比亚迪的具体工厂
-
public class BYDFactory implements CarFactory {
-
//创建者
-
@Override
-
public Car CreateCar() {
-
return new BYD();//返回比亚迪给ClientFactoryMethod
-
//更多逻辑
-
}
-
}
(3)抽象产品
-
<span style="font-weight: normal;"> //抽象产品角色
-
public interface Car {
-
public void run(); //更多具体逻辑.......
-
} </span>
(4)具体产品
奥迪产品: 实现Car接口,是一个具体的产品
-
//具体产品奥迪 </span>
-
public class AuDi implements Car{
-
@Override
-
public void run() {
-
System.out.println("奥迪跑起来了");
-
} //更多具体逻辑......
-
}
比亚迪产品: 实现Car接口,是一个具体的产品
-
//具体产品比亚迪 public class BYD implements Car{
-
@Override
-
public void run() {
-
System.out.println("比亚迪跑起来了"); }
-
}
测试:
-
//工厂方法模式
-
public class ClientFactoryMethod {//客户端
-
//调用者
-
public static void main(String[] args) {
-
Car audi=new AudiFactory().CreateCar();//通过具体的工厂创建产品
-
Car byd=new BYDFactory().CreateCar();
-
//车跑
-
audi.run();
-
byd.run();
-
}
-
}
4.小结
工厂方法模式的优点:
1.良好的封装性,代码结构清晰。创建产品时只要知道这个产品的类名或约束字符串就可以,不用知道创建的过程,降低了板块间的耦合。
2.优秀的可拓展性。 在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以适应变化。 如要新增加奔驰benz,只要新建一个奔驰产品: 实现Car接口,奔驰工厂:实现CarFactory接口,就行了。
3.屏蔽产品类,产品类如何实现如何变化,调用者不用关心,只需关心产品的接口,只要接口保持不变,系统的上层模版就不会发生变化。
4.工厂方法模式是典型的解耦框架,符合迪米特法则,也符合依赖倒置原则,还符合里氏替换原则。
迪米特法则:又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。
依赖倒置原则:A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
里氏替换原则:OCP作为OO的高层原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性。“抽象”是语言提供的功能。“多态”由继承语义实现。
工厂模式在项目中使用的非常频繁,在很多框架的代码中都可以发现它的应用。