工厂模式有三种:简单工厂,工厂方法,抽象工厂
简单工厂
简单工厂比较简单,就是封装一层生成对象的类,所有生成对象都放在这个类,可以把生成对象的任意类称为简单工厂
工厂方法:
工厂方法跟简单工厂不一样的地方在于每个对象都有其对应的工厂类生成,利于扩展,遵循开闭原则,单一原则
以下模拟场景,人开车,开飞机
定义交通工具抽象类
public abstract class Vehicles {
abstract void go();
}
定义工厂抽象类
public abstract class ViheclesFactory {
abstract Vehicles create();
}
定义Car类继承工具抽象类
public class Car extends Vehicles {
@Override
public void go() {
System.out.println("开汽车 嘟嘟嘟嘟");
}
}
定义Car工厂继承工厂抽象类,造车开始
public class CarFactory extends ViheclesFactory{
@Override
public Vehicles create(){
return new Car();
}
}
测试
public class Test {
public static void main(String[] args) {
ViheclesFactory factory = new CarFactory();
Vehicles vehicles = factory.create();
vehicles.go();
}
}
这样之后想开飞机,就定义飞机类继承工具抽象类和飞机工厂类继承工厂抽象类就可以了,这就是工厂方法
抽象工厂:
可以理解工厂方法就是简单版的抽象工厂,工厂方法是利于产品的扩展,而抽象工厂是利于产品一族的扩展,不利于产品的扩展,两者侧重点不一样
以下模拟场景,普通人开车,吃饭,武器
定义食物、武器、交通工具、工厂抽象类
public abstract class Food {
abstract void eat();
}
public abstract class Wepean {
abstract void shoot();
}
public abstract class Vehicle {
abstract void go();
}
public abstract class AbstractFactory {
abstract Food creatFood();
abstract Vehicle creatVehicle();
abstract Wepean createWepean();
}
定义普通人吃的东西,开的车,用的武器
public class Bread extends Food{
@Override
void eat() {
System.out.println("吃面包 ++++++++");
}
}
public class Car extends Vehicle {
@Override
public void go() {
System.out.println("开汽车 ----------");
}
}
public class Ak47 extends Wepean {
@Override
void shoot() {
System.out.println("AK47 =============");
}
}
定义普通人的工厂
public class DiQiuRenFactory extends AbstractFactory {
@Override
Food creatFood() {
return new Bread();
}
@Override
Vehicle creatVehicle() {
return new Car();
}
@Override
Wepean createWepean() {
return new Ak47();
}
}
测试
public class Test {
public static void main(String[] args) {
AbstractFactory factory = new HuoXingRenFactory();
factory.createWepean().shoot();
factory.creatFood().eat();
factory.creatVehicle().go();
}
}
这样一个产品族就定义成功了,之后再想扩展火星人一族,就可以定义火星人吃的饭,开的车,用的武器和火星人工厂就行了;
但是想要扩展产品,也就是想加一个普通人说话的场景,那改动就有点大了,而且违背了开闭原则,所以抽象工厂在产品族的维度上容易扩展,在产品的维度上扩展难
所以设计模式没有好坏之分,只有合适的才是最好的,任何东西都是,这就需要在项目开展前期在业务的理解基础上定义项目框架