抽象工厂模式

在工厂方法模式中,具体工厂生产具体的产品,每一个具体的工厂对应一种具体的产品,工厂方法具有唯一性。但有时候,希望一个工厂可以生产多个产品对象,而不是单一的产品对象,如一个电器工厂,既可以生产电视机,也可以生产电冰箱、空调、电饭锅等多种电器,而不是只生产一种电器,这时就需要抽象工厂模式

 

为了更好理解抽象工厂模式,先引入两个概念,产品等级结构和产品族

产品等级结构:产品等级结构,也可以称为产品的继承结构,如一个抽象类是手机,则它的子类有华为手机、小米手机、oppo手机等,抽象手机与具体的品牌手机之间构成了一个产品等级结构,抽象手机是父类,具体的品牌手机是其子类

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如华为工厂生产华为手机、华为耳机,华为手机位于手机产品等级结构中;华为耳机位于耳机产品等级结构中,华为手机、华为耳机构成一个产品族

 

产品等级结构与产品族示意图如下

图中,不同颜色的多个长方形、圆形、椭圆形分别构成 3 个不同的产品等级结构,而相同颜色的长方形、圆形、椭圆形构成一个产品族。只要确定一个产品的产品族及其所属的等级结构,就可以确定这个产品

当系统提供的工厂生产的产品是位于不同产品等级结构、不同类型的具体产品时,就需要使用抽象工厂模式。

 

抽象工厂模式示意图

 

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类。抽象工厂模式也称为 Kit 模式,是一种对象创建型模式 

 

下面以制作书籍为例,代码演示抽象工厂模式

定义抽象图书类

package com.design.abstractfactory;

/**
 * 抽象图书类
 */
public abstract class Book {

    public abstract void produce();
}

定义文学书类,继承抽象图书类

package com.design.abstractfactory;

/**
 * 文学书
 */
public class LiteratureBook extends Book{

    @Override
    public void produce() {
        System.out.println("制作文学书");
    }
}

定义哲学书类,继承抽象图书类

package com.design.abstractfactory;

/**
 * 哲学书
 */
public class PhilosophyBook extends Book{

    @Override
    public void produce() {
        System.out.println("制作哲学书");
    }
}

定义抽象包装盒类

package com.design.abstractfactory;

/**
 * 抽象包装盒类
 */
public abstract class Box {

    public abstract void produce();
}

定义文学书包装盒类,继承抽象包装盒类

package com.design.abstractfactory;

/**
 * 文学书包装盒
 */
public class LiteratureBox extends Box{

    @Override
    public void produce() {
        System.out.println("制作文学书包装盒");
    }
}

定义哲学书包装盒类,继承抽象包装盒类

package com.design.abstractfactory;

/**
 * 哲学书包装盒
 */
public class PhilosophyBox extends Box{

    @Override
    public void produce() {
        System.out.println("制作哲学书包装盒");
    }
}

定义书籍工厂接口

package com.design.abstractfactory;

/**
 * 书籍工厂接口
 */
public interface BookFactory {

    Book getBook();

    Box getBox();
}

定义文学书籍工厂,实现书籍工厂接口

package com.design.abstractfactory;

/**
 * 生产文学书和文学书包装盒的工厂
 */
public class LiteratureFactory implements BookFactory{

    @Override
    public Book getBook() {
        return new LiteratureBook();
    }

    @Override
    public Box getBox() {
        return new LiteratureBox();
    }
}

定义哲学书籍工厂,实现书籍工厂接口

package com.design.abstractfactory;

/**
 * 生产哲学书和哲学书包装盒的工厂
 */
public class PhilosophyFactory implements BookFactory{

    @Override
    public Book getBook() {
        return new PhilosophyBook();
    }

    @Override
    public Box getBox() {
        return new PhilosophyBox();
    }
}

至此,抽象工厂模式代码演示完成

可以看出,文学书籍工厂可以生产文学书和文学书包装盒;哲学书籍工厂生产哲学书和哲学书包装盒。文学书籍和文学书籍包装盒构成产品族,哲学书籍和哲学书籍包装盒构成另一个产品族

 

类图如下

测试调用

package com.design.abstractfactory;

/**
 * 测试调用
 */
public class TestMain {

    public static void main(String[] args) {
        //哲学书籍工厂
        PhilosophyFactory philosophyFactory = new PhilosophyFactory();
        //制作书籍
        Book book = philosophyFactory.getBook();
        book.produce();
        //制作书籍包装盒
        Box box = philosophyFactory.getBox();
        box.produce();
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟世君子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值