一、简单工厂模式
1.为什么使用简单工厂模式
举个例子,汽车的种类有很多种,包括轿车、SUV、商务车、大巴车等等,但这些汽车种类同属于一个大类,所以客户只需要告诉汽车厂需要生产哪种汽车,即可生产出对应的汽车。
2.如何使用简单工厂模式
1.以上方汽车生产为例,我们先创建一个接口Car,该接口有produceCar()方法用于生产汽车,代码如下:
public interface Car {
void produceCar();
}
2.再创建类SUVCar、VanCar、SedanCar、BusCar,用于表示各个种类的汽车,并实现Car接口:
/***********创建SUVCar***********/
public class SUVCar implements Car{
@Override
public void produceCar() {
System.out.println("生产越野车");
}
}
/***********创建VanCar***********/
public class VanCar implements Car{
@Override
public void produceCar() {
System.out.println("生产商务车");
}
}
/***********创建SedanCar***********/
public class SedanCar implements Car{
@Override
public void produceCar() {
System.out.println("生产轿车");
}
}
/***********创建BusCar***********/
public class BusCar implements Car{
@Override
public void produceCar() {
System.out.println("生产巴士");
}
}
3.最后创建工厂类CarFactory,声明一个静态方法createCar()用于创建具体的汽车对象,并传入carID,通过carID来选择具体要创建的汽车对象,代码如下:
public class CarFactory {
/**
* 创建Car
* @param carID
* @return
* @throws Exception
*/
public static Car createCar(int carID) throws Exception {
switch (carID){
case 0:
return new SedanCar();
case 1:
return new SUVCar();
case 2:
return new VanCar();
case 3:
return new BusCar();
default:
throw new Exception("输入车辆编号错误!");
}
}
}
4.简单工厂创建对象测试:
public class SimpleFactoryTest {
public static void main(String[] args) {
try {
CarFactory.createCar(2).produceCar();
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试打印如下:
生产商务车
二、抽象工厂模式
1.为什么使用抽象工厂模式
仍以上方汽车生产为例,上文说过,汽车的种类有很多种,包括轿车、SUV、商务车、大巴车等等,但这么多种汽车不可能都放到一个厂里面去进行生产,现实中一个汽车厂商一般都会有针对不同车型的分厂,这样更有利于厂商内部进行管理。如此一来,整个流程就变成:客户下单->经销商联系汽车总厂商->总厂商根据车型分派给相应的分厂->分厂生产->客户提车。 此时,如果以简单工厂模式实现上面流程,就比较力不从心了,处理起来比较复杂和麻烦
2.如何使用抽象工厂模式
1.首先创建一个工厂接口ICarFactory,声明方法getCarProduce(),用于返回汽车对象的接口IProduceCar:
public interface ICarFactory {
IProduceCar getCarProduce(String carNum);
}
后面的抽象工厂类和具体工厂类都需要实现这个接口,用于返回工厂对象。
2.创建汽车对象的接口IProduceCar
public interface IProduceCar {
void productCar();
}
该接口用于生成汽车对象的一些操作方法。
3.创建具体工厂类SUVCarFactory、VANCarFactory:
/***********创建SUVCarFactory***********/
public class SUVCarFactory implements ICarFactory {
@Override
public IProduceCar getCarProduce(String carNum) {
return new SUVCar();
}
}
/***********创建VANCarFactory***********/
public class VANCarFactory implements ICarFactory {
@Override
public IProduceCar getCarProduce(String carNum) {
return new VANCar();
}
}
实现ICarFactory 接口,并在接口实现方法中返回具体汽车对象。
4.创建具体汽车对象类SUVCar、VANCar:
/***********创建SUVCar***********/
public class SUVCar implements IProduceCar {
@Override
public void productCar() {
System.out.println("生产越野车");
}
}
/***********创建VANCar***********/
public class VANCar implements IProduceCar {
@Override
public void productCar() {
System.out.println("生产商务车");
}
}
实现汽车对象接口
5.创建汽车总工厂类,该工厂即为抽象工厂类:
public class BaseCarFactory implements ICarFactory {
@Override
public IProduceCar getCarProduce(String carNum) {
ICarFactory carFactory=null;
if (carNum.contains("suv")){
//构建SUV工厂对象 准备在SUV工厂生产
carFactory=new SUVCarFactory();
}else if (carNum.contains("van")){
//构建Van工厂对象 准备在Van工厂生产
carFactory=new VANCarFactory();
}
if (carFactory!=null){
IProduceCar car=carFactory.getCarProduce(carNum);
return car;
}
return null;
}
}
该类实现了工厂接口ICarFactory ,并在其实现方法中,根据传入的carNum,创建对应的汽车工厂,最后根据创建的汽车工厂,返回汽车实体对象接口。
6.抽象工厂创建对象测试:
public class AbstractFactoryTest {
public static void main(String[] args) {
BaseCarFactory carFactory=new BaseCarFactory();
carFactory.getCarProduce("van002").productCar();
}
}
测试打印如下:
生产商务车
注:该博文仅用于记录自己的理解,有误的地方还请各位看官多多包涵指出,大家一起学习进步!