工厂模式实现了创建者和调用者的分离
0 在不用工厂模式的情况下,是怎么样的??
以下面的类图为例:我们创建了一个汽车接口,并写了两个它的实现类
public interface Car {
void run();
}
public class byd implements factoryMethod.Car, Car{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("byd");
}
}
public class Audi implements Car{
public void run() {
System.out.println("audi");
}
}
public class Client01 {
public static void main(String[] args) {
Car c1 = new Audi();
Car c2 = new byd();
c1.run();
c2.run();
}
}
可以看到,在实现的时候,调用者既要知道汽车的接口,又要知道实现汽车的具体的类。假如说现实中,一个司机需要汽车来上下班,那他还得知道汽车是怎样new出来的吗? 这显然不符合常理。
下面就将介绍如何使得实现和调用分离。
1.1.简单工厂模式(静态工厂模式)
建立简单工厂类
/*
* 简单工厂类:对于新的增加需要修改已有的方法,不能满足开闭原则
*/
public class CarFactory {
public static Car createCar(String type) {
if ("audi".equals(type)) {
return new Audi();
}else if("byd".equals(type)) {
return new byd();
}else {
return null;
}
}
}
测试代码:
public class Client2 {
public static void main(String[] args) {
Car c1 = CarFactory.createCar("audi");
Car c2 = CarFactory.createCar("byd");
c1.run();
c2.run();
}
}
很显然,上面在调用的过程中不再需要知道每辆车的实现类,只需要和造汽车的工厂打交道就可以了
简单工厂模式的缺点在于增加新的功能时必须修改源代码,违反了开闭原则。
这一点可以使用下面的工厂方法模式来解决。
2. 工厂方法模式
- 一个抽象产品类,可以派生出多个具体产品类。
- 一个抽象工厂类,可以派生出多个具体工厂类。
工厂方法模式的类图
建立汽车工厂方法接口:
public interface CarFactory {
Car createCar();
}
接下来建立audi汽车的工厂方法:
public class AudiFactory implements CarFactory{
@Override
public Car createCar() {
// TODO Auto-generated method stub
return new Audi();
}
}
以及byd汽车的工厂方法:
public class BYDFactory implements CarFactory{
@Override
public Car createCar() {
// TODO Auto-generated method stub
return new byd();
}
}
测试代码:
public class Client {
public static void main(String[] args) {
Car c1 = new AudiFactory().createCar();
Car c2 = new BYDFactory().createCar();
c1.run();
c2.run();
}
}
对于每一类的汽车,都需要建立一个独立的工厂,这便保证了开闭原则,
但是会增加了类的数量。
所以说根据设计理论来讲,工厂方法模式占优势。但是实际上仍然采用简单工厂模式较多
3. 抽象工厂模式
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
比如我们要创建不同的飞机,不同类型的飞机需要不同的发动机,座椅和轮胎。这便是不同的产品族。
首先建立发动机接口以及他的两个实现类:
public interface Engine {
void run();
void start();
}
class LuxuryEngine implements Engine{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("run fast");
}
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("start fast");
}
}
class LowEngine implements Engine{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("run slow");
}
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("start slow");
}
}
接着建立座椅接口及其两个实现类:
public interface Seat {
void masage();
}
class LuxurySeat implements Seat{
@Override
public void masage() {
// TODO Auto-generated method stub
System.out.println("massage automically");
}
}
class LowSeat implements Seat{
@Override
public void masage() {
// TODO Auto-generated method stub
System.out.println("massage not automically");
}
}
最后建立轮胎接口以及两个实现类:
public interface Tyre {
void revolve();
}
class LuruxyTyre implements Tyre{
@Override
public void revolve() {
// TODO Auto-generated method stub
System.out.println("not wreck");
}
}
class LowTyre implements Tyre{
@Override
public void revolve() {
// TODO Auto-generated method stub
System.out.println("easy wreck");
}
}
下面是抽象工厂类以及两个具体工厂类:
//抽象工厂类
public interface CarFactory {
Engine createEngine();
Seat createSeat();
Tyre createTyre();
}
public class LowCarFactory implements CarFactory{
@Override
public Engine createEngine() {
// TODO Auto-generated method stub
return new LowEngine();
}
@Override
public Seat createSeat() {
// TODO Auto-generated method stub
return new LowSeat();
}
@Override
public Tyre createTyre() {
// TODO Auto-generated method stub
return new LowTyre();
}
}
public class LuxuryCarFactory implements CarFactory{
@Override
public Engine createEngine() {
// TODO Auto-generated method stub
return new LuxuryEngine();
}
@Override
public Seat createSeat() {
// TODO Auto-generated method stub
return new LuxurySeat();
}
@Override
public Tyre createTyre() {
// TODO Auto-generated method stub
return new LuruxyTyre();
}
}
测试代码:
public class Client {
public static void main(String[] args) {
CarFactory factory = new LuxuryCarFactory();
Engine engine = factory.createEngine();
engine.run();
engine.start();
}
}