理论写着写着就明白了
应用场景
- 将实体类的创建转交给工厂,方便产品的扩展
- 例如:一键换肤,换主题…等等
- 名词–抽象工厂 abstract class | 形容词–工厂方法 interface method
譬如:
我现在有个需求,需要给我三个类,一个汽车,一个飞机,一艘船,这三个都是交通工具,都有一个移动的方法,我的功能要求出门乘坐交通工具,最开始时乘坐汽车,我们可以new 一个汽车,调用它的move方法;后续我们不做汽车了,改成飞机这个时候我们代码应该怎么写? 把new的汽车改成飞机再调用飞机的move方法吗?将来再换成轮船呢?随着代码业务的不断加深,逻辑不断复杂,这样就需要我们能尽量少的改动代码完成这个变换。这就可以根据业务来使用工厂模式设计功能。
二话不说上个代码
public class Car implements Moveable{
public void go() {
System.out.println("Car go dudududududududududu......");
}
}
public class Plane {
public void go() {
System.out.println("Plane fly shua shua shua shua shua ....");
}
}
public interface Moveable {
void go();
}
/**
* 工厂方法
*/
public class CarFactory {
public Moveable create() {
System.out.println("将来可以再这里添加具体别的逻辑");
return new Car();
}
}
/**
* 这里我们用工厂方法来完成
* 将来我们换乘飞机的时候 只需要加一个飞机的工厂,让飞机也实现接口功能
* 后续的所有代码都不需要更改直接就完成变换
*/
public class Main {
public static void main(String[] args) {
Moveable a = new CarFactory().create();
//Moveable a = new PlaneFactory().create();
a.go();
}
}
上面我们针对某个实体类的具体功能做了一个工厂方法方便以后的功能扩展,我们再原有的基础上再加一些新的功能,车子move,吃了一个food,可以用AK打出子弹;将来一个魔法扫把move,吃了一个food,可以发动魔法攻击;这样两个不同的产品族,将来还要扩充更多的产品族,怎样设计能更方便之后的扩展?----抽象工厂。
二话不说再上个代码
/**
* 抽象出一个工厂 可以创建交通工具 | 食物 | 武器
*/
public abstract class AbstractFactory {
abstract Food createFood();
abstract Vehicle createVehicle();
abstract Weapon createWeapon();
}
/**
* 实际的抽象共创 将来可以在内部扩展功能
* 当我需要创建一个魔法类的工厂时,同样集成我的抽象工厂,返回不同的魔法物品就可以了
*/
public class ModernFactory extends AbstractFactory {
@Override
Food createFood() {
return new Bread();
}
@Override
Vehicle createVehicle() {
return new Car();
}
@Override
Weapon createWeapon() {
return new AK47();
}
}
//将交通工具|食物|武器 抽出一个父类
public abstract class Vehicle {
abstract void go();
}
public abstract class Food {
abstract void printName();
}
public abstract class Weapon {
abstract void shoot();
}
//具体到实体类
public class Car extends Vehicle {
public void go() {
System.out.println("Car go du du du du du ......");
}
}
public class Bread extends Food {
public void printName() {
System.out.println("printName ba ba tang ...");
}
}
public class Bread extends Food {
public void printName() {
System.out.println("printName ba ba tang ...");
}
}
public class Main {
public static void main(String[] args) {
//最原始的做法
/*Car car = new Car();
car.go();
AK47 w = new AK47();
w.shoot();
Bread b = new Bread();
b.printName();*/
//利用工厂模式之后 我们可以更方便快捷的扩展新增功能需求
AbstractFactory f = new ModernFactory();
//扩展魔法物品 只需要更改这个工厂就可以了
//AbstractFactory f = new MagicFactory();
Vehicle vehicle = f.createVehicle();
vehicle.go();
Weapon weapon = f.createWeapon();
weapon.shoot();
Food food = f.createFood();
food.printName();
}
}
工厂模式代码写起来比较绕,大家主要理解这个模式的意思,将创建对象交由工厂管理,方便扩展功能。骨架搭起来比较繁琐,但应用上要便捷不少。