工厂模式,实现了创建者和调用者得分离。
如果不用工厂模式,假设我们现在有一个汽车接口(Car)两个具体实现类(Audi、Byd),一个客户端类调用具体方法运行,那么代码如下:
/**
* User:tumbler
* Desc:汽车接口
*/
public interface Car {
void run();
}
/**
* User:tumbler
* Desc:奥迪类
*/
public class Audi implements Car {
@Override
public void run() {
System.out.println("我是奥迪...");
}
}
/**
* User:tumbler
* Desc:比亚迪类
*/
public class Byd implements Car {
@Override
public void run() {
System.out.println("我是比亚迪...");
}
}
/**
* User:tumbler
* Desc:无工厂模式调用
*/
public class Client01 {
public static void main(String[] args) {
Car c1 = new Audi();
Car c2 = new Byd();
c1.run();
c2.run();
}
}
创建一个简单工厂的示例类,负责创建汽车,而客户端无需知道是怎么创建的,只需告诉工厂我需要什么。
/**
* User:tumbler
* Desc:简单工厂类
*/
public class CarFactory {
public static Car createCar(String type) {
if ("奥迪".equals(type)) {
return new Audi();
}else if ("比亚迪".equals(type)) {
return new Byd();
}else {
return null;
}
}
}
客户端调用时,无需知道具体创建,只需知道我需要什么:
/**
* User:tumbler
* Desc:简单工厂客户端调用
*/
public class Client02 {
public static void main(String[] args) {
Car c1 = CarFactory.createCar("奥迪");
Car c2 = CarFactory.createCar("比亚迪");
c1.run();
c2.run();
}
}
**要点:**为了避免简单工厂模式的缺点,不完全满足OCP。工厂方法模式和简单工厂模式最大的区别在于:简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
**示例:**依然使用上面的汽车接口Car.java,奥迪实现类Audi.java、比亚迪实现类Byd.java。再创建一个工厂接口CarFactory.java,包含一个创建汽车的方法createCar():
/**
* User:tumbler
* Desc:工厂模式:工厂方法模式-汽车工厂接口
*/
public interface CarFactory {
Car createCar();
}
接下来分别新建奥迪工厂类和比亚迪工厂类,都实现汽车工厂接口:
/**
* User:tumbler
* Desc:工厂方法模式:奥迪工厂
*/
public class AudiFactory implements CarFactory{
@Override
public Car createCar() {
return new Audi();
}
}
/**
* User:tumbler
* Desc:工厂方法模式:比亚迪工厂
*/
public class BydFactory implements CarFactory{
@Override
public Car createCar() {
return new Byd();
}
}
客户端调用:
/**
* User:tumbler
* Desc:工厂方法模式-客户端调用
*/
public class Client01 {
public static void main(String[] args) {
// 通过各自的工厂创建各类汽车
Car c1 = new AudiFactory().createCar();
Car c2 = new BydFactory().createCar();
c1.run(); // 我是奥迪...
c2.run(); // 我是比亚迪...
}
}
那么现在我想新增一个奔驰类Benz.java,然而我们不需要修改其他的任何代码,只需要新增Benz.java、奔驰工厂BenzFactory.java实现汽车工厂CarFactory.java,即可,方便了扩展,符合了开闭原则(OCP)。
工厂方法模式的UML图如下所示:
根据设计理论建议:工厂方法模式
实际情况下:一般都用简单工厂模式
作用: 用来生产不同产品族的全部产品。(对于增加新的功能,无能为力,支持增加新的产品族)。抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一个非常好的解决方式。
在汽车中,发动机、轮胎、座椅属于一个产品族。由高端发动机、高端轮胎、高端座椅构成高端汽车产品;由低端发动机、低端轮胎、低端座椅构成低端汽车产品;
下面我们创建以下类来实现抽象工厂模式:
发动机接口-Engine.java、高端发动机-LuxuryEngine.java、低端发动机-LowEngine.java
座椅接口-Seat.java、高端座椅-LuxurySeat.java、低端座椅-LowSeat.java
轮胎接口-Tyre.java、高端轮胎-LuxuryTyre.java、低端轮胎-LowTyre.java
汽车工厂接口-CarFactory.java
高端汽车工厂-LuxuryCarFactory.java
低端汽车工厂-LowCarFactory.java
客户端-Client.java
package src.com.tumbler.factory.abstractFactory;
/**
* User:tumbler
* Desc:抽象工厂模式-发动机接口
*/
public interface Engine {
void run();
void start();
}
/**
* 发动机实现类-高端发动机
*/
class LuxuryEngine implements Engine {
@Override
public void run() {
System.out.println("高端发动机--跑的快");
}
@Override
public void start() {
System.out.println("高端发动机--启动快");
}
}
/**
* 发动机实现类-低端发动机
*/
class LowEngine implements Engine {
@Override
public void run() {
System.out.println("低端发动机--跑的慢");
}
@Override
public void start() {
System.out.println("低端发动机--启动慢");
}
}
package src.com.tumbler.factory.abstractFactory;
/**
* User:tumbler
* Desc:抽象工厂模式-座椅接口
*/
public interface Seat {
void massage();
}
/**
* 高端座椅实现类
*/
class LuxurySeat implements Seat {
@Override
public void massage() {
System.out.println("高端座椅--舒服--可自动按摩");
}
}
/**
* 低端座椅实现类
*/
class LowSeat implements Seat {
@Override
public void massage() {
System.out.println("低端座椅--不舒服--不可自动按摩");
}
}
package src.com.tumbler.factory.abstractFactory;
/**
* User:tumbler
* Desc:抽象工厂模式--轮胎接口
*/
public interface Tyre {
void revolve();
}
/**
* 高端轮胎实现类
*/
class LuxuryTyre implements Tyre {
@Override
public void revolve() {
System.out.println("高端轮胎--旋转耐磨损");
}
}
/**
* 高端轮胎实现类
*/
class LowTyre implements Tyre {
@Override
public void revolve() {
System.out.println("低端轮胎--旋转易磨损");
}
}
package src.com.tumbler.factory.abstractFactory;
/**
* User:tumbler
* Desc:抽象工厂模式--汽车工厂接口
*/
public interface CarFactory {
Engine createEngine();
Seat createSeat();
Tyre createTyre();
}
package src.com.tumbler.factory.abstractFactory;
/**
* User:tumbler
* Desc:抽象工厂模式--高端汽车工厂类
*/
public class LuxuryCarFactory implements CarFactory {
@Override
public Engine createEngine() {
return new LuxuryEngine();
}
@Override
public Seat createSeat() {
return new LuxurySeat();
}
@Override
public Tyre createTyre() {
return new LuxuryTyre();
}
}
package src.com.tumbler.factory.abstractFactory;
/**
* User:tumbler
* Desc:抽象工厂模式--低端汽车工厂类
*/
public class LowCarFactory implements CarFactory {
@Override
public Engine createEngine() {
return new LowEngine();
}
@Override
public Seat createSeat() {
return new LowSeat();
}
@Override
public Tyre createTyre() {
return new LowTyre();
}
}
客户端:
package src.com.tumbler.factory.abstractFactory;
/**
* User:tumbler
* Desc:抽象工厂模式--客户端
*/
public class Client {
public static void main(String[] args) {
CarFactory factory = new LuxuryCarFactory();
Engine e = factory.createEngine();
e.run(); // 高端发动机--跑的快
e.start(); // 高端发动机--启动快
}
}