目录
工厂设计模式,顾名思义类似一家工厂来制造各种产品,目的在于提高代码的可扩展性。
一、案例引出
通过接口来实现一类产品的功能,如目前有飞机、轮船、汽车这类产品的实体类,同时需要具备移动的属性,此时我们优先想到的是通过接口来实现,例如:
插件Moveable接口来让各个需要该属性的对象实现,但这样做在业务结构简单是没问题,当业务结构复杂时,该方式的拓展性并不太好,没增加一种产品都需要去实现多个属性接口。
public interface Moveable {
void go();
}
public class Car implements Moveable{
@Override
public void go() {
System.out.println("car goes...");
}
}
public class Plane implements Moveable{
@Override
public void go() {
System.out.println("plane goes...");
}
}
public class Ship implements Moveable{
@Override
public void go() {
System.out.println("ship goes...");
}
}
下面来看看工厂模式是如何实现的
二、简单工厂模式
简单工厂模式适用于产品种类单一的业务
通过简单工厂可以有效管理种类单一的产品
public class SimpleFactory {
public static Moveable createCar(){
//前至处理
return new Car();
}
public static Moveable createShip(){
//前至处理
return new Ship();
}
public static Moveable createPlane(){
//前至处理
return new Plane();
}
}
产品创建:当产品增加时直接在工厂里进行添加,拓展性较好
public static void main(String[] args) {
Moveable car = SimpleFactory.createCar();
Moveable ship = SimpleFactory.createShip();
Moveable plane = SimpleFactory.createPlane();
car.go();
ship.go();
plane.go();
}
二、抽象工厂
对于业务复杂,种类较多的产品时简单工厂并不能有效解决种类繁多管理的问题,由此引入抽象工厂进行管理:
我们可以创建一个抽象工厂来管理各个大类的产品:
public abstract class AbstractFactory {
abstract Vehicle createVehicle();
abstract Food createFood();
abstract Weapon createWeapon();
}
分别创建各个大类的抽象类:
public abstract class Food {
abstract void eat();
}
public abstract class Vehicle {
abstract void go();
}
public abstract class Weapon {
abstract void fight();
}
创建多种不同的工厂来加工不同的产品:都继承自AbastractFactory。产品都继承自类别抽象类。
public class ModernFactory extends AbstractFactory{
@Override
Vehicle createVehicle() {
return new Car();
}
@Override
Food createFood() {
return new Bread();
}
@Override
Weapon createWeapon() {
return new AK47();
}
}
public class AncientFactory extends AbstractFactory {
@Override
Vehicle createVehicle() {
return new Ship();
}
@Override
Food createFood() {
return new Fish();
}
@Override
Weapon createWeapon() {
return new Arrow();
}
}
以上演示为多个不同工厂的实例。
工厂生产产品:该设计模式也可借鉴单例模式来实现静态工厂。
public static void main(String[] args) {
AncientFactory ancientFactory = new AncientFactory();
Food food = ancientFactory.createFood();
food.eat();
}
工厂模式生产和管理产品总结到此。