工厂模式实现了创建者和调用者的分离

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();
	}
}

更多推荐

java设计模式之工厂模式