工厂模式
- 实现了创建者和调用者的分离.
- 详细分类
- 简单工厂模式:用来生产同一等级结构中的任意产品.(对于新增产品需要修改已有代码)
- 工厂方法模式:用来生产同一等级结构中的固定产品.(支持增加任意产品)
- 抽象工厂模式:用来生产不同产品族的全部产品.(对于增加新的产品无能为力;支持增加产品族)
一. 简单工厂模式
- 简单工厂模式也叫静态工厂模式,其类内部一般是使用静态方法,通过接受不同的参数来返回不同的对象实例.
- 对于增加新产品无能为力,不修改代码无法扩展.
- Java代码示例:
接口Car:
public interface Car {
void run();
}
Audi类
public class Audi implements Car{
public void run{
System.out,println("Audi");
}
}
BYD类
public class BYD implements Car{
public void run{
System.out,println("BYD");
}
}
SimpleFactory类
public class SimpleFactory { //该类用于创建并返回各种类
public static Car createCar(String name){ //该方法接受Car类型
if(name.equals("Audi")){ //返回Audi
return new Audi();
}
else if(name.equals("BYD")){ //返回BYD
return new BYD();
}
else{ //无匹配则返回null
return null;
}
}
}
测试代码
public class test{
public static void main(String[] args){
//如果不采用工厂模式
Car c1 = new Audi();
Car c2 = new BYD();
//如果采用工厂模式
Car c3 = SimpleFactory.createCar("Audi");
Car c4 = SimpleFactory.createCar("BYD");
}
}
采用简单工厂模式用户只需要与SimpleFactory进行交互,不需要直接与各种类打交道.
- 也可以采用下列方式实现简单工厂模式:
public class CarFactory{
public static Car createAudi(){
return new Audi();
};
public static Car createBYD(){
return new BYD();
};
}
二.工厂方法模式
- 与前述简单工厂不同的是,工厂方法模式采用CarFactory接口,并通过实现该方法来返回一个实例.
- 此方式可以避免修改原有代码,直接添加新类.
- Java代码示例(引用简单工厂模式的Car接口和Audi,BYD类):
创建工厂接口CarFactory
public interface CarFactory{
Car createCar();
}
CreateAudi类
public class CreateAudi implements CarFactory{
public Car createCar(){ //实现接口方法,创建并返回Audi对象
return new Audi();
}
}
CreateBYD类
public class CreateBYD implements CarFactory{
public Car createCar(){ //实现接口方法,创建并返回Audi对象
return new BYD();
}
}
测试类
public class Client{
public static void main(String[] agrs){
Car c1 = new CreateAudi.createCar(); // 通过调用CreateXXX类来生成对象
Car c2 = new CreateBYD.createCar();
}
}
三.抽象工厂模式
- 用来生产不同产品族的全部产品.(对于增加新的产品无能为力;支持增加产品族)
- 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品质/业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式.
- 关于产品族:例如发动机,轮胎,座椅等系列产品构成一个产品族,通过创建不同接口并实现相关接口来创建不同产品.
- Java代码示例:
发动机接口及实现类
public interface Engine{ //创建接口
void run();
void start();
}
class LuxuryEngine implements Engine{ //高端发动机类实现发动机接口
public void run(){
}
public void start(){
}
}
class LowerEngine implements Engine{ //低端发动机类实现发动机接口
public void run(){
}
public void start(){
}
}
座椅接口及实现类
public interface Seat{ //创建接口
void function();
}
class LuxurySeat implements Seat{ //高端座椅实现座椅接口
public void function(){
}
}
class LowerSeat implements Seat{ //低端座椅实现座椅接口
public void function(){
}
}
轮胎接口及实现类
public interface Tyre{ //创建接口
void function();
}
class LuxuryTyre implements Tyre{ //高端轮胎实现轮胎接口
public void function(){
}
}
class LowerTyre implements Tyre{ //低端轮胎实现轮胎接口
public void function(){
}
}
CarFactory接口
public interface CarFactory{
Engine createEngine();
Seat createSeat();
Tyre createTyre();
}
LuxuryCarFactory类
public class LuxuryCarFactory implements CarFactory{ //实现接口
public Engine createEngine(){
return new LuxuryEngine();
}
public Seat createSeat(){
return new LuxurySeat();
}
public Tyre createTyre(){
return new LuxuryTyre();
}
}
LowerCarFactory类
public class LowerCarFactory implements CarFactory{ //实现接口
public Engine createEngine(){
return new LowerEngine();
}
public Seat createSeat(){
return new LowerSeat();
}
public Tyre createTyre(){
return new LowerTyre();
}
}
以上代码简单的示范了抽象工厂模式的基本思想.
工厂模式要点:
- 简单工厂模式
-虽然某种程度不符合设计原则,但实际使用最多. - 工厂方法模式
-不修改已有类的前提下,通过增加新的工厂类实现扩展. - 抽象工厂模式
-不可以增加产品,可以增加产品族.
应用场景
- JDK中Calendar的getInstance方法
- JDBC中Connection对象的获取
- Hibernate中SessionFactory创建Session
- Spring中IOC容器创建管理bean对象
- XML解析中DocumentBuilderFactory创建解析器对象
- 反射中Class对象的newInstance