本文最后更新于 2025年7月24日 上午
抽象工厂模式提供了更细粒度的对象创建过程,通过接口定义和接口实现 提供了具备更丰富功能的工厂对象创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| public abstract class Animal{ public Animal(){ System.out.println("这里是动物工厂"); } }
public abstract class House{ }
public class Dog extends Animal{ public Dog(){ System.out.println("得到了一只小狗"); } }
public class Sheep extends Animal{ public Sheep(){ System.out.println("得到了一只小羊"); } }
public class DogHouse extends House { }
public class SheepHouse extends House { }
public interface AnimalFactory{ Animal createAnimal();
House createHouse(); }
public class DogFactory implements AnimalFactory{ public Animal createAnimal(){ return new Dog(); }
public House createHouse(){ return new DogHouse(); }
}
public class SheepFactory implements AnimalFactory{ public Animal createAnimal(){ return new Sheep(); }
public House createHouse(){ return new SheepHouse(); } }
public class Test { public static void main(String[] args){ AnimalFactory af = new DogFactory(); Animal animal = af.createAnimal(); House house = af.createHouse(); af = new SheepFactory(); animal = af.createAnimal(); house = af.createHouse(); } }
|
抽象工厂通过组合多个产品接口的方式,定义一个“产品族”的创建规范。在 Java 中通过接口实现多种产品的创建组合,从而在一个工厂中统一创建相关联的对象。
案例
以工厂方法实现支付路径创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| public interface payChannel{ boolean pay(BigDecimal price); }
public class Alipay implements PayChannel{ public boolean pay(BigDecimal price){ System.out.println("调用支付宝SDK发起支付,价格:"+price); return true ; } }
public class WXpay implements PayChannel{ public boolean pay(BigDecimal price){ System.out.println("调用微信支付SDK发起支付,价格:"+price); return true ; } }
public class PayChannelFactory{ public static PayChannel getPayChannel(int type){ PayChannel payChannel = null ; if(type == 0){ payChannel = new AliPay(); }else if (type == 1){ payChannel = new WXpay(); } return payChannel; } }
public class Test { public static void main(String[] args){ PayChannel payChannel = PayChannelFactory.getPayChannel(0); payChannel.pay(new BigDecimal(88.88)); payChannel = PayChannelFactory.getPayChannel(1); payChannel.pay(new BigDecimal(88.88)); } }
|
适用场景
简单工厂
- 需要创建的对象较少
- 客户端不关心对象的创建过程
工厂方法模式
- 客户只知道创建产品的工厂名,而不知道具体的产品名
- 创建对象的任务由多个具体子工厂中的某一个完成
- 客户不关心创建产品的细节
抽象工厂模式
- 和工厂方法一样,客户端不需要知道它所创建的对象的类
- 需要一组对象共同完成某种功能,并且可能存在多组对象完成不同功能的情况
- 系统结构稳定,不会频繁增加对象
总结
从简单工厂到工厂方法,再到抽象工厂,这一系列模式的演进本质上是 对象创建职责的转移与粒度的细化过程 ,也是 从面向实现到面向抽象的设计思想升级 。
- 在简单工厂模式中 ,对象的创建依赖于条件判断逻辑,通常由客户端提供参数来决定创建哪种具体对象。这种方式虽然集中控制了实例化过程,但违背了开放封闭原则,扩展性较差。
- 在工厂方法模式中 ,将对象的创建逻辑延迟到具体的工厂子类中,客户端通过不同的工厂实现来获取具体对象。相比简单工厂,它消除了条件分支,提高了可扩展性,并遵循了“对扩展开放、对修改关闭”的设计原则。
- 在抽象工厂模式中 ,进一步抽象出一组相关产品(即“产品族”)的创建接口,通过组合多个产品的创建方法,使得客户端可以在保持产品族一致性的同时,批量创建功能相关的对象。这种设计强调了 对象间的协同关系 ,适用于构建结构稳定、业务复杂、依赖协调的系统场景。
抽象工厂的设计思路强调:对象本身服务于业务流程,而不是主导业务流程,因此更适合在流程驱动或组件化架构中构建一整套相互依赖的业务资源,以实现高度内聚、低耦合的目标。