设计模式(四)——抽象工厂模式
应用场景
简单的工厂模式只能返回一类的对象,现在有一个汽车工厂,可以生产轮胎、方向盘、座椅三种对象,宝马需要宝马轮胎,宝马方向盘和宝马座椅,而奔驰需要奔驰轮胎,奔驰方向盘和奔驰座椅,这时候就要用到抽象工厂。
先创建一个抽象类,可以生产 轮胎、方向盘和座椅。
package abstractfactory;
import abstractfactory.chair.Chair;
import abstractfactory.steer.Steer;
import abstractfactory.tyre.Tyre;
/**
* @title: AbstractFactory
* @Author 张宜强
* @Date: 2022/4/6 17:39
* @Effect:
*/
public abstract class AbstractFactory {
//轮胎
public abstract Tyre createTyre();
//方向盘
public abstract Steer createSteering();
//座椅
public abstract Chair createChair();
}
实现BCFactory,可以生产奔驰轮胎,奔驰方向盘和奔驰座椅
package abstractfactory;
import abstractfactory.chair.BCChair;
import abstractfactory.chair.Chair;
import abstractfactory.steer.BCSteer;
import abstractfactory.steer.Steer;
import abstractfactory.tyre.BCTyre;
import abstractfactory.tyre.Tyre;
/**
* @title: BWFactory
* @Author 张宜强
* @Date: 2022/4/6 20:11
* @Effect:
*/
public class BCFactory extends AbstractFactory{
@Override
public BCTyre createTyre() {
return new BCTyre();
}
@Override
public BCSteer createSteering() {
return new BCSteer();
}
@Override
public BCChair createChair() {
return new BCChair();
}
}
奔驰座椅
package abstractfactory.chair;
/**
* @title: BCChair
* @Author 张宜强
* @Date: 2022/4/6 20:10
* @Effect:
*/
public class BCChair extends Chair{
@Override
public void create(){
System.out.println("奔驰座椅被生产");
}
}
奔驰方向盘
package abstractfactory.steer;
/**
* @title: BCSteer
* @Author 张宜强
* @Date: 2022/4/6 20:10
* @Effect:
*/
public class BCSteer extends Steer{
@Override
public void create(){
System.out.println("奔驰方向盘被生产");
}
}
奔驰轮胎
package abstractfactory.tyre;
/**
* @title: BCTyre
* @Author 张宜强
* @Date: 2022/4/6 20:11
* @Effect:
*/
public class BCTyre extends Tyre{
@Override
public void create(){
System.out.println("奔驰轮胎被生产");
}
}
这样我就可以在main方法里面使用奔驰的工厂类里面来创建对象。
package abstractfactory;
import abstractfactory.chair.Chair;
import abstractfactory.steer.Steer;
import abstractfactory.tyre.Tyre;
/**
* @title: Main
* @Author 张宜强
* @Date: 2022/4/6 17:29
* @Effect:
*/
public class Main {
public static void main(String[] args) {
AbstractFactory BCfactory = new BCFactory();
Tyre tyre = BCfactory.createTyre();
tyre.create();
Chair chair = BCfactory.createChair();
chair.create();
Steer steering = BCfactory.createSteering();
steering.create();
}
}
运行结果:
如果要生产宝马的零件,那现在只需要再创建一个BMFactory来生产宝马零件,不会对原来的代码进行改动,符合对拓展开放,对修改关闭
宝马轮胎
package abstractfactory.tyre;
/**
* @title: BCTyre
* @Author 张宜强
* @Date: 2022/4/6 20:11
* @Effect:
*/
public class BMTyre extends Tyre{
@Override
public void create(){
System.out.println("宝马轮胎被生产");
}
}
宝马方向盘
package abstractfactory.steer;
/**
* @title: BCSteer
* @Author 张宜强
* @Date: 2022/4/6 20:10
* @Effect:
*/
public class BMSteer extends Steer{
@Override
public void create(){
System.out.println("宝马方向盘被生产");
}
}
宝马座椅
package abstractfactory.chair;
/**
* @title: BCChair
* @Author 张宜强
* @Date: 2022/4/6 20:10
* @Effect:
*/
public class BMChair extends Chair{
@Override
public void create(){
System.out.println("宝马座椅被生产");
}
}
宝马工厂
package abstractfactory;
import abstractfactory.chair.BMChair;
import abstractfactory.steer.BMSteer;
import abstractfactory.tyre.BMTyre;
/**
* @title: BWFactory
* @Author 张宜强
* @Date: 2022/4/6 20:11
* @Effect:
*/
public class BMFactory extends AbstractFactory{
@Override
public BMTyre createTyre() {
return new BMTyre();
}
@Override
public BMSteer createSteering() {
return new BMSteer();
}
@Override
public BMChair createChair() {
return new BMChair();
}
}
代码结构