设计模式复习--抽象工厂模式

抽象工厂模式提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。

抽象工厂允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。这样一来,客户就可以从具体的产品中被解耦。

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更新

抽象工厂的缺点:由于划分的比较细致,导致过多抽象类和接口的出现,导致类文件超多,所以实际开发中谨慎考虑 。

抽象工厂的优点:实现解耦,能够在不同的产品类之间灵活切换。

posted @ 2014-04-21 22:07  西北野狼  阅读(210)  评论(0编辑  收藏  举报