抽象工厂模式提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。
抽象工厂允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。这样一来,客户就可以从具体的产品中被解耦。
FACTORY?追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory 工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
//定义不同的产品之间的一定具备的标准,用interface实现 //其中的method()方法可看作提取出不同产品的共性,如手机都有类似的功能 interface IProductA { public void method(); } interface IProductB { public void method(); } // 实现了产品标准实现的一系列具体产品 // 由于已经设计好A1由厂商1生产,故以下输出代码有“厂商x” class ProductA1 implements IProductA { public void method() { System.out.println("厂商1 生产ProductA1 ..."); } } class ProductA2 implements IProductA { public void method() { System.out.println("厂商2 生产ProductA2 ..."); } } class ProductB1 implements IProductB { public void method() { System.out.println("厂商1 生产ProductB1 ..."); } } class ProductB2 implements IProductB { public void method() { System.out.println("厂商2 生产ProductB2 ..."); } } // 每一种牌子的产品生产工厂,即不同的厂商负责自己牌子产品的生产 abstract class Factory1 { abstract IProductA getProductA1(); abstract IProductB getProductB1(); } abstract class Factory2 { abstract IProductA getProductA2(); abstract IProductB getProductB2(); } // 具体的工厂用来生产相关的产品 class ConcreteFactory1 extends Factory1 { public IProductA getProductA1() { return new ProductA1(); } public IProductB getProductB1() { return new ProductB1(); } } class ConcreteFactoryB extends Factory2 { public IProductA getProductA2() { return new ProductA2(); } public IProductB getProductB2() { return new ProductB2(); } } // 测试类 public class AbstractFactoryModel { public static void main(String[] args) { test(); } public static void test() { // 厂商1负责生产产品A1、B1 Factory1 factory1 = new ConcreteFactory1(); IProductA productA1 = factory1.getProductA1(); IProductB productB1 = factory1.getProductB1(); productA1.method(); productB1.method(); // 厂商2负责生产产品A2、B2 Factory2 factory2 = new ConcreteFactoryB(); IProductA productA2 = factory2.getProductA2(); IProductB productB2 = factory2.getProductB2(); productA2.method(); productB2.method(); } }
2015年12月8日21:38:02更新
抽象工厂的缺点:由于划分的比较细致,导致过多抽象类和接口的出现,导致类文件超多,所以实际开发中谨慎考虑 。
抽象工厂的优点:实现解耦,能够在不同的产品类之间灵活切换。