一、简介
在上一节的学习中,主要学习了简单工厂模式。简单工厂模式比较适合于提前能够考虑到大部分可能的情况,否则扩展时,就不太符合OCP原则。扩展时需要修改工厂类,但其实在一般项目中,简单工厂模式反而是使用比较多的。原因就在于工厂方法模式虽然符合OCP原则,扩展方便,扩展不需要修改工厂类,但会为每一种情况添加一个新类,最终导致产生出太多的类。
二、实现
工厂方法模式的实现过程如下。
1、与简单工厂模式一样,先创建好Car接口和两个实现类
Car接口,定义一个run方法。
package com.zwh.gof23.factory.factorymethod;
/**
* 汽车接口,定义汽车动作
* @author zwh
*
*/
public interface Car {
void run();
}
实现类Audi及byd:
package com.zwh.gof23.factory.factorymethod;
/**
* Audi类,实现Car接口
* @author zwh
*
*/
public class Audi implements Car {
@Override
public void run() {
System.out.println("奥迪run");
}
}
package com.zwh.gof23.factory.factorymethod;
/**
* Byd类,实现Car接口
* @author zwh
*
*/
public class Byd implements Car{
@Override
public void run() {
System.out.println("比亚迪run!");
}
}
2、创建一个工厂接口,定义创建Car实例的方法。
package com.zwh.gof23.factory.factorymethod;
/**
* 创建Car实例的工厂接口
* @author zwh
*
*/
public interface CarFactory {
Car createCar();
}
3、分别创建Audi及Byd的工厂实现类,实现CarFactory接口。
package com.zwh.gof23.factory.factorymethod;
public class AudiFactory implements CarFactory {
@Override
public Car createCar() {
return new Audi();
}
}
package com.zwh.gof23.factory.factorymethod;
public class BydFactory implements CarFactory {
@Override
public Car createCar() {
return new Byd();
}
}
三、测试
测试类:
package com.zwh.gof23.factory.factorymethod;
public class TestClient {
/**
* @param args
*/
public static void main(String[] args) {
Car c1=new AudiFactory().createCar();
Car c2=new BydFactory().createCar();
c1.run();
c2.run();
}
}
要创建不同的对象实例时,就调用对应的工厂实现类中的方法。
四、小结
相比前一张中的简单工厂模式,工厂方法模式在扩展时就比较容易了。只需要再新增一个CarFactory接口的实现类,重写createCar方法。不需要去修改CarFactory接口及原本的实现类。但会产生过多的类。