- 大家好!欢迎莅临厚土燎原的天地,深感荣幸能与您相遇在此,共同品读我的拙作。您的阅读如同春风化雨,对我而言意义非凡。衷心邀请您留下宝贵的评论与指点,每一字一句都是对我莫大的鼓励与鞭策。热烈欢迎,期待与您智慧碰撞,共绘思想的火花!
- 🌿🌿🌿 个人主页:厚土燎原
目录
描述
抽象工厂模式(Abstract Factory Pattern)是面向对象设计模式中创建型模式的一种,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在抽象工厂模式中,客户端不依赖于产品类实例的如何被创建、组合和表达的细节,这是通过使用一个共同的接口来指定创建相关对象的工厂类来达到的。
本质:提供一个创建一组对象的接口,一个具体工厂可以生产多个产品。
角色
抽象工厂:提供可以创建多个产品的接口
具体工厂:实现创建产品的接口,完成产品的创建。
抽象产品:产品的公共接口。
具体产品:工厂创建的目标。
优点
1、隔离了具体类的生成 ,使得客户端不需要知道也不需要指定具体产品的类。
2、易于交换产品系列 ,由于具体工厂类是在一个应用中独立变化的,因此增加一个新的产品族就变得很容易,只需要增加一个新的具体工厂类即可,不影响已有的系统结构。
3、有利于产品的一致性 ,当一个系列的产品对象被设计在一起工作时,它们可以相互影响,以保证其行为的一致性。
缺点
1、难以支持新种类的产品 ,因为抽象工厂接口确定了可以被创建的产品集合,增加新的产品种类需要修改抽象工厂的接口,并可能影响到现有的具体工厂类。
2、系统扩展较为复杂 ,如果需要增加一个新的产品族,除了需要增加新的具体产品类外,还需要增加一个新的具体工厂类,并在客户端中扩展以使用新的具体工厂类。
适用场景
1、当系统需要独立于产品的创建、组合和表示时 。
2、当系统需要配置多个系列中的一个对象时 (如配置不同风格的GUI界面)。
3、当相关对象家族中的对象必须被一起使用时 (例如,在一起工作的不同品牌的硬件)。 4、当你想提供一个产品类库,并只想显示它们的接口而不是实现时 。
总结
简述:不同条件下创建不同实例
一句话概括:产品标准化,生产更高效
目的:封装创建细节
生活案例:实体工厂
实例
抽象工厂
public interface IControllerFactory {
IOperatorController getOperatorController();
IUIController getUIController();
}
具体工厂
public class AndroidFactory implements IControllerFactory {
@Override
public IOperatorController getOperatorController() {
return null;
}
@Override
public IUIController getUIController() {
return null;
}
}
public class IosFactory implements IControllerFactory {
@Override
public IOperatorController getOperatorController() {
return null;
}
@Override
public IUIController getUIController() {
return null;
}
}
public class WpFactory implements IControllerFactory {
@Override
public IOperatorController getOperatorController() {
return null;
}
@Override
public IUIController getUIController() {
return null;
}
}
抽象产品
public interface IOperatorController {
void move();
}
public interface IUIController {
void draw();
}
具体产品
public class AndroidOperatorController implements IOperatorController {
@Override
public void move() {
System.out.println("android move");
}
}
public class AndroidUIController implements IUIController {
@Override
public void draw() {
System.out.println("android draw");
}
}
public class IosOperatorController implements IOperatorController {
@Override
public void move() {
System.out.println("ios move");
}
}
public class IosUIController implements IUIController {
@Override
public void draw() {
System.out.println("ios draw");
}
}
public class WpOperatorController implements IOperatorController {
@Override
public void move() {
System.out.println("wp move");
}
}
public class WpUIController implements IUIController {
@Override
public void draw() {
System.out.println("wp draw");
}
}
应用
public static void main(String[] args) {
IControllerFactory wpFactory = new WpFactory();
IControllerFactory iosFactory = new IosFactory();
IControllerFactory androidFactory = new AndroidFactory();
IOperatorController wpOperatorController = wpFactory.getOperatorController();
IUIController wpUIController = wpFactory.getUIController();
wpOperatorController.move();
wpUIController.draw();
IOperatorController iosOperatorController = iosFactory.getOperatorController();
IUIController iosUIController = iosFactory.getUIController();
iosOperatorController.move();
iosUIController.draw();
IOperatorController androidOperatorController = androidFactory.getOperatorController();
IUIController androidUIController = androidFactory.getUIController();
androidOperatorController.move();
androidUIController.draw();
}