设计模式(三)工厂模式
需求与思考
- 任意定制交通工具
- 继承Moveable
- 任意定制生产过程
- Moveable XXXFactory.create()
- 任意定制产品一族
- 一个工厂生产一族的产品
简单工厂(SimpleFactory)
原理
定义一个工厂方法,统一创建对象,在对象的创建方法中添加各种逻辑
代码实现
/**
* 简单工厂的可扩展性不好
*/
public class SimpleVehicleFactory {
public Car createCar() {
//before processing
return new Car();
}
public Broom createBroom() {
return new Broom();
}
}
静态工厂
原理
类似于简单工厂,利用静态方法实现的工厂即可称为静态工厂
单例可视为静态工厂
代码实现
略
工厂方法
原理
通过方法新建类即可理解为工厂方法
Factory Method 产品维度扩展
代码实现
- 工厂实现
public class CarFactory {
public Moveable create() {
System.out.println("a car created!");
return new Car();
}
}
抽象工厂
原理
为了实现更好的扩展产品族,定义一个Factory接口,通过不同的工厂生产一族的产品
代码实现
- 抽象工厂接口
public abstract class AbastractFactory {
abstract Food createFood();
abstract Vehicle createVehicle();
abstract Weapon createWeapon();
}
- 魔法工厂实现
public class MagicFactory extends AbastractFactory {
@Override
Food createFood() {
return new MushRoom();
}
@Override
Vehicle createVehicle() {
return new Broom();
}
@Override
Weapon createWeapon() {
return new MagicStick();
}
}
- 现代工厂实现
public class ModernFactory extends AbastractFactory {
@Override
Food createFood() {
return new Bread();
}
@Override
Vehicle createVehicle() {
return new Car();
}
@Override
Weapon createWeapon() {
return new AK47();
}
}
四个角色
- 抽象工厂
- 抽象产品
- 具体工厂
- 具体产品
总结
简单工厂、静态工厂实际上不能完全算作是一种设计模式
实际上两种设计模式:
- 工厂方法
- 对于产品维度的扩展更合适
- 抽象工厂
- 对于产品族的维度扩展更合适