介绍
- 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
-
AbstractFactory : 抽象工厂角色,它声明了一组用于创建一种产品的方法,每一个方法对应一种产品。
-
ConcreteFactory : 具体工厂角色,它实现了在抽象工厂中定义的创建产品的方法,生产一组具体产品,这饿产品构件成了一个产品种类,每一个产品都位于某个产品等级结构中。
-
AbstractProduct:抽象产品角色,为每种产品声明接口。
-
ConcreteProduct:具体产品角色,定义了工厂生产的具体产品对象,实现抽象产品接口声明的业务方法。
案例
发送机接口
//发动机
public interface Engine {
void run();
void start();
}
发动机实现类EngineA
public class EngineA implements Engine{
@Override
public void run() {
System.out.println("转的快!");
}
@Override
public void start() {
System.out.println("启动快,自动档");
}
}
发动机实现类EngineB
public class EngineB implements Engine{
@Override
public void run() {
System.out.println("转的慢!");
}
@Override
public void start() {
System.out.println("启动快,手动档");
}
}
座椅接口
//座椅
public interface Chair {
void run();
}
座椅实现类ChairA
public class ChairA implements Chair{
@Override
public void run() {
System.out.println("可以自动加热!");
}
}
座椅实现类ChairB
public class ChairB implements Chair{
@Override
public void run() {
System.out.println("不能加热!");
}
}
汽车工厂
public interface CarFactory {
// 创建发动机
Engine createEngine();
// 创建座椅
Chair createChair();
}
汽车工厂实现类
public class JiLiFactory implements CarFactory {
@Override
public Engine createEngine() {
return new EngineA();
}
@Override
public Chair createChair() {
return new ChairA();
}
}
客户端
public class Client {
public static void main(String[] args) {
CarFactory carFactory=new JiLiFactory();
Engine engine=carFactory.createEngine();
engine.run();
engine.start();
}
}
优点和缺点
优点:
1)降低耦合:抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展;
2)更符合开-闭原则:新增一种产品类时,只需要增加相应的具体产品类和相应的工厂子类即可
缺点:
1)抽象工厂模式的最大缺点就是产品族扩展非常困难
适用场景:
1) 一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
2) 这个系统有多个系列产品,而系统中只消费其中某一系列产品
github Demo地址 : ~~~传送门~~~
个人博客地址:blog.yanxiaolong.cn/