工厂模式在《Java与模式》中分为三类:
1)简单工厂模式(Simple Factory):不利于产生系列产品;
2)工厂方法模式(Factory Method):又称为多形性工厂;
3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品;
简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。
工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构
具体事例:
类图:
1.从测试类开始
package com.bestaone.pattern.factory;
public class Test {
static Car car;
public static void main(String[] args) {
// 测试简单工厂
// 有点:只需告诉需要什么品牌车,就能生产什么车给你
car = SimpleFactory.buildCar("BMW");
car.driver();
// 工厂方法
// 优点:不同的车由不同的工厂生产,需要什么车,就使用对应的工厂生产
FactoryMethod factory = new BenzCarFactory();
car = factory.buildCar();
car.driver();
// 抽象工厂
// 优点:结合了简单工厂与工厂方法,不同的工厂生产不同功能的车(跑车、商务车)
// 而需要品牌车则告诉工厂所要的品牌
AbstractFactory aFactory = new SportsFactory();
car = aFactory.buildCar("BMW");
car.driver();
}
}
2.汽车接口
package com.bestaone.pattern.factory;
public interface Car {
public void driver();
}
3.宝马品牌车接口
package com.bestaone.pattern.factory;
/**
* 宝马
* @author 张国圣
*/
public interface Bmw extends Car {
@Override
public void driver();
}
4.奔驰品牌车接口
package com.bestaone.pattern.factory;
/**
* 奔驰
* @author 张国圣
*/
public interface Benz extends Car {
@Override
public void driver();
}
5.宝马车
package com.bestaone.pattern.factory;
public class BmwCar implements Bmw{
@Override
public void driver() {
System.out.println("开宝马");
}
}
6.奔驰车
package com.bestaone.pattern.factory;
public class BenzCar implements Benz{
@Override
public void driver() {
System.out.println("开奔驰");
}
}
7.宝马商务车
package com.bestaone.pattern.factory;
public class BmwBussinessCar implements Car{
@Override
public void driver() {
System.out.println("开宝马商务车");
}
}
8.宝马跑车
package com.bestaone.pattern.factory;
public class BmwSportsCar implements Car{
@Override
public void driver() {
System.out.println("开宝马跑车");
}
}
9.奔驰商务车
package com.bestaone.pattern.factory;
public class BenzBussinessCar extends BenzCar{
@Override
public void driver() {
System.out.println("开奔驰商务车");
}
}
10.奔驰跑车
package com.bestaone.pattern.factory;
public class BenzSportsCar implements Car{
@Override
public void driver() {
System.out.println("开奔驰跑车");
}
}
11.简单工厂
package com.bestaone.pattern.factory;
/**
* 简单工厂
* @author 张国圣
*/
public class SimpleFactory {
public static Car buildCar(String name){
Car car = null;
if("BMW".equals(name)){
car = new BmwCar();
}else{
car = new BenzCar();
}
return car;
}
}
12.工厂方法
package com.bestaone.pattern.factory;
/**
* 工厂方法
* @author 张国圣
*/
public interface FactoryMethod {
public abstract Car buildCar();
}
13.工厂方法子类--生产宝马车的工厂
package com.bestaone.pattern.factory;
public class BmwCarFactory implements FactoryMethod{
@Override
public Car buildCar() {
return new BmwCar();//专门制造宝马
}
}
14.工厂方法子类--生产奔驰车的工厂
package com.bestaone.pattern.factory;
public class BenzCarFactory implements FactoryMethod{
@Override
public Benz buildCar() {
return new BenzCar();//专门制造奔驰
}
}
15.抽象工厂
package com.bestaone.pattern.factory;
/**
* 抽象工厂
* @author 张国圣
*/
public interface AbstractFactory {
public abstract Car buildCar(String name);
}
16.抽象工厂子类--专门生产各品牌商务车工厂
package com.bestaone.pattern.factory;
/**
* 专门制造专门制造商务车
* @author 张国圣
*/
public class BussinessFactory implements AbstractFactory{
@Override
public Car buildCar(String name) {
Car car = null;
if("BMW".equals(name)){
car = new BmwBussinessCar();
}else{
car = new BenzBussinessCar();
}
return car;
}
}
17.抽象工厂子类--专门生产各品牌跑车工厂
package com.bestaone.pattern.factory;
/**
* 专门制造跑车
* @author 张国圣
*/
public class SportsFactory implements AbstractFactory{
@Override
public Car buildCar(String name) {
Car car = null;
if("BMW".equals(name)){
car = new BmwSportsCar();
}else{
car = new BenzSportsCar();
}
return car;
}
}