1 简单工厂
隐藏具体产品的创建过程。
类图
对于客户端 来说不需要了解车具体的创建过程。只需要把相应的车型传给CarFactory.
//抽象车
public abstract class Car {
}
//具体的车 奥迪
public class AoDiCar extends Car{
}
//具体的车 宝马
public class BaoMaCar extends Car {
}
//具体的车 大众
public class DaZhongCar extends Car {
}
//汽车工厂类
public class CarFactory {
public static final int CAR_BAOMA = 1;
public static final int CAR_DAZHONG = 2;
public static final int CAR_AODI = 3;
public Car createCar(int type) {
switch (type) {
case CAR_BAOMA:
return new BaoMaCar();
case CAR_DAZHONG:
return new DaZhongCar();
case CAR_AODI:
return new AoDiCar();
default:
return new AoDiCar();
}
}
}
//客户端
public class Client {
public static void main(String[] args) {
CarFactory carFactory = new CarFactory();
carFactory.createCar(CarFactory.CAR_BAOMA);
}
}
2 工厂方法
类图
使用场景
比如长城的汽车在中国卖的越来越好。那么对于两款车长城C50和哈弗h6的制造工厂生产这两款车的轮胎大小和发动机型号会有所不同。C50工厂只能生产16寸轮胎和1.5T发动机。而H6工厂只能生产20寸轮胎和2.0发动机 。
下面是代码
抽象工厂
public abstract class CarFactory {
/**
* 生产轮胎
* @return
*/
public abstract ITire createTire();
/**
* 生产发动机
* @return
*/
public abstract IEngine createEngine();
}
具体工厂
/**
*长城C50工厂
*/
public class C50Factory extends CarFactory{
public ITire createTire() {
return new Inch16Tire();
}
public IEngine createEngine() {
return new T1Dot6Engine();
}
}
/**
* 具体工厂 哈弗H6工厂
*/
public class H6Factory extends CarFactory {
public ITire createTire() {
return new Inch20Tire();
}
public IEngine createEngine() {
return new T2Dot0Engine();
}
}
抽象产品
public interface IEngine {
/**
* 发动机
*/
void engine();
}
public interface ITire {
/**
* 轮胎
*/
void tire();
}
具体产品
/**
*1.5排量的发动机
*/
public class T1Dot6Engine implements IEngine{
public void engine() {
System.out.println("1.5T小排量发动机");
}
}
/**
*2.0T发动机
*/
public class T2Dot0Engine implements IEngine {
public void engine() {
System.out.println("2.0T排量发动机");
}
}
/**
* 16英寸轮胎
*
*/
public class Inch16Tire implements ITire {
public void tire() {
System.out.println("16英寸轮胎");
}
}
/**
*20英寸轮胎
*/
public class Inch20Tire implements ITire{
public void tire() {
System.out.println("20英寸轮胎");
}
}
客户类
public class Client {
public static void main(String[] args) {
System.out.println("长城C50工厂生产的产品=============");
CarFactory factoryC50 = new C50Factory();
factoryC50.createEngine().engine();
factoryC50.createTire().tire();
System.out.println("哈弗H6工厂生产的产品===============");
CarFactory factoryH6 = new H6Factory();
factoryH6.createEngine().engine();
factoryH6.createTire().tire();
}
}
打印结果
长城C50工厂生产的产品=============
1.5T小排量发动机
16英寸轮胎
哈弗H6工厂生产的产品===============
2.0T排量发动机
20英寸轮胎