Java - 抽象工厂模式

本文介绍抽象工厂模式的基本概念,包括其结构、角色定义及其实现示例。通过一个具体的水果工厂案例,展示了如何利用抽象工厂模式来创建相关联的对象集合,并保持同一产品族内对象的一致性。

-- 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂(产品等级结构)创建其他工厂(产品族)。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

--在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

如图:

一、结构

组成(角色)作用
抽象产品(Product)列出所有模糊产品
产品族模糊产品(Fuzzy Product)提供具体产品功能
具体产品(Concrete Product)描述生产的具体产品功能
抽象产品工厂(Creator)列出所有产品族
产品族工厂(Concrete Creator)提供该族里具体产品信息的接口

二、结构栗子

三、优缺点

1、优点

  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

2、缺点

  • 产品等级易扩展,但产品族难扩展,牵一发而动全身。

一、工厂角色

1、抽象产品工厂-列出所有产品

package com.AbstractFactory_03;

/**
  * @Description: 抽象工厂
  * @Author: ziHeng
  * @Date: 2018/8/2 9:50 PM
  * @Param:
  * @return:
  */
public interface FruitFactory {

    Fruit getApple();

    Fruit getBanana();

}

2、产品族工厂

package com.AbstractFactory_03;

/**
 * @description: 北方水果工厂
 * @author: ziHeng
 * @create: 2018-08-02 21:53
 **/
public class NorthFruitFactory implements FruitFactory {

    @Override
    public Fruit getApple() {
        return new NorthApple();
    }

    @Override
    public Fruit getBanana() {
        return new NorthBanana();
    }
}

二、产品角色

1、产品角色接口

package com.AbstractFactory_03;

/**
 * @description: 抽象产品角色-水果
 * @author: ziHeng
 * @create: 2018-08-02 14:31
 **/
public interface Fruit {

    void get();

}

2、模糊产品角色-苹果

package com.AbstractFactory_03;

/**
 * @description: 模糊产品角色-苹果
 * @author: ziHeng
 * @create: 2018-08-02 14:30
 **/
public abstract class Apple implements Fruit{

    public abstract void get();

}
package com.AbstractFactory_03;

/**
 * @description: 模糊产品角色-香蕉
 * @author: ziHeng
 * @create: 2018-08-02 14:31
 **/
public abstract class Banana implements Fruit {

    public abstract void get();

}

3、具体产品角色

package com.AbstractFactory_03;

/**
 * @description: 北方苹果
 * @author: ziHeng
 * @create: 2018-08-02 22:00
 **/
public class NorthApple extends Apple{

    @Override
    public void get() {
        System.out.println("得到北方苹果");
    }

}
package com.AbstractFactory_03;

/**
 * @description: 北方香蕉
 * @author: ziHeng
 * @create: 2018-08-02 22:03
 **/
public class NorthBanana extends Banana {

    @Override
    public void get() {
        System.out.println("得到北方香蕉");
    }

}

调用Test类:

package com.AbstractFactory_03;

/**
 * @description: 调用者
 * @author: ziHeng
 * @create: 2018-08-02 22:04
 **/
public class Test {

    public static void main(String[] args) {
        FruitFactory northFruitFactory = new NorthFruitFactory();
        northFruitFactory.getApple().get();
        northFruitFactory.getBanana().get();
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值