设计模式-抽象工厂模式(AbstractFactory)

抽象工厂模式是向客户端提供一个接口(FruitFactory),,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族(NorthFruit、SouthFruit)的产品对象。

角色和职责:

1.抽象工厂(factory)-FruitFactory:

   抽象工厂模式的核心,包含对多个产品接口的说明,任何工厂类都必须实现这个接口

2.具体工厂(concrete factory)-NorthFruitFactory、SouthFruitFactory:

   负责实例化某个产品族(比如apple,apple的产品族是NorthApple、SouthApple)中的产品对象

3.抽象产品(product)-Apple、Banana:

   抽象模式所创建的所有对象的父类,它负责所有实例所共有的公共接口

4.具体产品(concrete product)-NorthApple、SouthApple、NorthBanana、SouthBanana:

 

UML图:

 

 

具体代码:

 

/**
 * 水果接口
 */
public interface Fruit {
    void pick();
}
/**
 * 抽象苹果类
 */
public abstract class Apple implements Fruit{
    public abstract void pick();
}
/**
 * 抽象香蕉类
 */
public abstract class Banana implements Fruit{
    public abstract void pick();
}
/**
 * 北方苹果
 */
public class NorthApple extends Apple{
    @Override
    public void pick() {
        System.out.println("采摘北方苹果");
    }
}
/**
 * 采摘北方香蕉
 */
public class NorthBanana extends Banana{
    @Override
    public void pick() {
        System.out.println("采摘北方香蕉");
    }
}
/**
 * 南方苹果
 */
public class SouthApple extends Apple{
    @Override
    public void pick() {
        System.out.println("采摘南方苹果");
    }
}
/**
 * 南方香蕉
 */
public class SouthBanana extends Banana{
    @Override
    public void pick() {
        System.out.println("采摘南方香蕉");
    }
}
/**
 * 水果工厂接口
 */
public interface FruitFactory {
    Fruit getApple();
    Fruit getBanana();
}
/**
 * 北方水果工厂
 */
public class NorthFruitFactory implements FruitFactory {
    @Override
    public Fruit getApple() {
        return new NorthApple();
    }

    @Override
    public Fruit getBanana() {
        return new NorthBanana();
    }
}
/**
 * 南方水果工厂
 */
public class SouthFruitFactory implements FruitFactory{
    @Override
    public Fruit getApple() {
        return new SouthApple();
    }

    @Override
    public Fruit getBanana() {
        return new SouthBanana();
    }
}
public class Main {
    public static void main(String[] args) {
        FruitFactory northFruitFactory = new NorthFruitFactory();//北方水果工厂
        Fruit northApple = northFruitFactory.getApple();//生产苹果
        northApple.pick();
        Fruit northBanana = northFruitFactory.getBanana();//生产香蕉
        northBanana.pick();

        FruitFactory southFruitFactory = new SouthFruitFactory();//南方水果工厂
        Fruit southApple = southFruitFactory.getApple();//生产苹果
        southApple.pick();
        Fruit southBanana = southFruitFactory.getBanana();//生产香蕉
        southBanana.pick();
    }
}

结果:

采摘北方苹果
采摘北方香蕉
采摘南方苹果
采摘南方香蕉

 

优缺点:

优:

  • 抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建
  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
  • 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

缺:增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性

 

应用场景:

抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。

应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。

 

源码:https://github.com/qjm201000/design_pattern_abstractFactory.git

posted @ 2018-12-03 00:29  qjm201000  阅读(203)  评论(0编辑  收藏  举报