基本概念
作用:实现创建者和调用者分离
核心本质:实例化对象不使用new,用工厂方法代替
将选择实现类,创建对象统一管理和控制,从而将调用者和实现类解耦
三种工厂模式
1、简单工厂
简单工厂也叫静态工厂模式,一般是使用静态方法,通过接受不同的参数来返回不同的实例
缺点:对增加新的产品无能为力,只能通过修改来扩展,不符合开闭原则
// 简单工厂模式
public class CarFactory {
// 使用静态方法,通过接受不同的参数来返回不同的实例
public static Car createCar(String name) {
if ("比亚迪".equals(name)) {
return new Byd();
} else if ("奥迪".equals(name)) {
return new Audi();
} else {
return null;
}
}
}
// 这种也是简单工厂模式的体现
public class CarFactory02 {
public static Car createByd() {
return new Byd();
}
public static Car createAudi() {
return new Audi();
}
}
// 简单工厂情况下,获取对象实例
public class Client {
public static void main(String[] args) {
// 通过调用工厂类来获取对象实例
Car c1 = CarFactory.createCar("奥迪");
Car c2 = CarFactory.createCar("比亚迪");
c1.showName();
c2.showName();
}
}
2、工厂方法模式
工厂方法模式和简单工厂模式最大的不同:
简单工厂模式只有一个工厂类,而工厂方法模式有一组实现了相同接口的工厂类
public interface CarFactory {
Car createCar();
}
//返回奥迪类实例
public class AudiFactory implements CarFactory{
@Override
public Car createCar() {
return new Audi();
}
}
//返回比亚迪类实例
public class BydFactory implements CarFactory{
@Override
public Car createCar() {
return new Byd();
}
}
3、抽象工厂模式
抽象工厂模式(Abstract Factory Pattern):
是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂,重点理解什么是产品族
产品等级结构:即产品的继承结构,如一个抽象类是轮胎,其子类有高端轮胎和低端轮胎,则轮胎与具体级别的轮胎之间构成了一个产品等级结构
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,例如下面例子中高端车工厂生产的轮胎、引擎和座椅就可以看成一个产品族
举个例子,我们有一个超级汽车工厂,这个工厂高端车和低端车都生产
为了方便管理,我们需要造出两个子工厂,专门负责生产高端车和低端车
public interface CarFactory {
Engine createEngine();
Seat createSeat();
Tire createTire();
}
public class LowerFactory implements CarFactory{
@Override
public Engine createEngine() {
return new LowerEngine();
}
@Override
public Seat createSeat() {
return new LowerSeat();
}
@Override
public Tire createTire() {
return new LowerTire();
}
}
public class AdvancedFactory implements CarFactory{
@Override
public Engine createEngine() {
return new AdvancedEngine();
}
@Override
public Seat createSeat() {
return new AdvancedSeat();
}
@Override
public Tire createTire() {
return new AdvancedTire();
}
}
子工厂又有专门生产座椅、引擎和轮胎的方法
public interface Engine {
void engineInfo();
}
class AdvancedEngine implements Engine {
@Override
public void engineInfo() {
System.out.println("高端引擎");
}
}
class LowerEngine implements Engine {
@Override
public void engineInfo() {
System.out.println("低端引擎");
}
}
===============================================
public interface Seat {
void seatInfo();
}
class AdvancedSeat implements Seat {
@Override
public void seatInfo() {
System.out.println("高端座椅");
}
}
class LowerSeat implements Seat {
@Override
public void seatInfo() {
System.out.println("低端座椅");
}
}
===============================================
public interface Tire {
void tireInfo();
}
class AdvancedTire implements Tire {
@Override
public void tireInfo() {
System.out.println("高端轮胎");
}
}
class LowerTire implements Tire {
@Override
public void tireInfo() {
System.out.println("低端轮胎");
}
}
超级工厂只需要调用相应子工厂就可以生产高端车和低端车了
public class Client {
public static void main(String[] args) {
CarFactory carFactory = new AdvancedFactory();
Engine engine = carFactory.createEngine();
engine.engineInfo();
}
}