前言
工厂模式的用处:灵活控制生产对象的过程。比如说我们想在生产对象的时候打印日志或者加上权限控制,那么工厂模式就是一种好的选择。
大体分为两种
1、工厂模式(主要处理多产品的作用),比如我们定位了交通工具下就有很多种产品,如飞机,汽车,火车等
2、抽象工厂模式(主要处理多产品族作用),产品族的概念,举个例子就像苹果公司有自己的产品一族,如苹果手机,苹果电脑等。而华为也有自己的产品一族,如华为手机,华为电脑等
一、工厂模式
1.1 类图如下
1.1 工厂
BaseFactory
public abstract class BaseFactory {
abstract BaseVehicle create();
}
CarFactory
public class CarFactory extends BaseFactory {
@Override
BaseVehicle create() {
//处理生产过程,如权限校验,或者日志记录等
return new Car();
}
}
TrainFactory
public class TrainFactory extends BaseFactory {
@Override
BaseVehicle create() {
//处理生产过程,如权限校验,或者日志记录等
return new Train();
}
}
1.2 产品
BaseVehicle
public abstract class BaseVehicle {
abstract void run();
}
Car
public class Car extends BaseVehicle {
@Override
void run() {
System.out.println("汽车~~~");
}
}
Train
public class Train extends BaseVehicle {
@Override
void run() {
System.out.println("火车~~~");
}
}
1.3 测试
public class Main {
public static void main(String[] args) {
//将来可以使用apollo等配置中心,在上面配置key=com.cch.factorymethod.TrainFactory
//然后在下面的地方,利用反射 Class.forName() 产生对应对象
BaseFactory factory = new TrainFactory();
BaseVehicle vehicle = factory.create();
vehicle.run();
}
}
二、抽象工厂模式
2.1 类图如下
2.2 产品
BasePhone
public abstract class BasePhone {
abstract void call();
}
ApplePhone
public class ApplePhone extends BasePhone {
@Override
void call() {
System.out.println("苹果电话。。。");
}
}
HuaweiPhone
public class HuaweiPhone extends BasePhone {
@Override
void call() {
System.out.println("华为电话~~~");
}
}
BaseComputer
public abstract class BaseComputer {
abstract void compute();
}
AppleComputer
public class AppleComputer extends BaseComputer {
@Override
void compute() {
System.out.println("苹果电脑~~~~");
}
}
HuaweiComputer
public class HuaweiComputer extends BaseComputer {
@Override
void compute() {
System.out.println("华为电脑!!!");
}
}
2.3 工厂
BaseFactory
public abstract class BaseFactory {
abstract BasePhone createPhone();
abstract BaseComputer createComputer();
}
AppleFactory
public class AppleFactory extends BaseFactory {
@Override
BasePhone createPhone() {
//权限或者日志记录
return new ApplePhone();
}
@Override
BaseComputer createComputer() {
//权限或者日志记录
return new AppleComputer();
}
}
HuaweiFactory
public class HuaweiFactory extends BaseFactory {
@Override
BasePhone createPhone() {
//权限或者日志记录
return new HuaweiPhone();
}
@Override
BaseComputer createComputer() {
//权限或者日志记录
return new HuaweiComputer();
}
}
2.4 测试
public class Main {
public static void main(String[] args) {
//将来可以使用apollo等配置中心,在上面配置key=com.cch.abstractfactorymethod.AppleFactory
//然后在下面的地方,利用反射 Class.forName() 产生对应对象
BaseFactory factory = new AppleFactory();
BasePhone phone = factory.createPhone();
BaseComputer computer = factory.createComputer();
phone.call();
computer.compute();
}
}