设计模式-抽象工厂模式

Posted qjm201000

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-抽象工厂模式相关的知识,希望对你有一定的参考价值。

抽象工厂模式是向客户端提供一个接口(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






以上是关于设计模式-抽象工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式 创建者模式 工厂设计模式 -- 抽象工厂设计模式介绍和实现

设计模式:抽象工厂模式

设计模式11:抽象工厂模式

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式-简单工厂模式工厂模式抽象工厂模式-(创建型模式)