设计模式之——抽象工厂模式

一、基本介绍

抽象工厂模式(创建型):是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构,总而言之,抽象工厂模式用于创建一系列相关的产品族。

二、包含角色

1.抽象工厂:提供了创建产品的接口,每个具体工厂的父类接口,可以创建多个不同等级的产品。

2.具体工厂:抽象工厂的实现类,负责创建具体的产品。

3.抽象角色:需要定义产品的抽象,为工厂创建出来实例的公共接口,抽象工厂模式有多个抽象角色的产品。

4.具体产品:抽象角色的实现类,由工厂返回的具体产品实例,它和具体工厂之间是多对一的关系。

三、案例及UML类图

案例说明:

             某客户需要电子产品,主要是耳机和手机,委托了目前两大著名厂商,三星和华为进行生成,这两个厂商都能生产出各自品牌且不同的耳机,以后可能还会订购苹果品牌产品。

 

UML类图:

类ElectronicFactory:

public interface ElectronicFactory {

    /**
     * 创建电话
     * @return 电话类
     */
    Phone  createPhone();

    /**
     * 创建耳机
     * @return 耳机类
     */
    Headset createHeadset();
}

 

说明:电子工厂抽象类,抽象工厂角色,用于定义工厂生产的接口(产品),生产耳机和手机。

类HuaWeiFactory:

public class HuaWeiFactory implements ElectronicFactory {

    @Override
    public Phone createPhone() {
        return new HuaWeiPhone();
    }

    @Override
    public Headset createHeadset() {
        return new HuaWeiHeadset();
    }
}

说明:华为工厂,抽象工厂的一个实现类,具体工厂角色,生产华为品牌的耳机和手机。

类SanXingFactory:

public class SanXingFactory implements ElectronicFactory {

    @Override
    public Phone createPhone() {
        return new SanXingPhone();
    }

    @Override
    public Headset createHeadset() {
        return new SanXingHeadset();
    }
}

说明:三星工厂,抽象工厂的一个实现类,具体工厂角色,生产三星品牌的耳机和手机。

 

类Headset:

public interface Headset {


    void listen();
}

说明:耳机抽象类,抽象角色,用于定义耳机的公共接口listen(听歌)。

类Phone:

public interface Phone {


     void call();
}

说明:手机抽象类,抽象角色,用于定义手机的公共接口call(打电话)。

类HuaWeiHeadset:

public class HuaWeiHeadset implements Headset {

    @Override
    public void listen() {
        System.out.println("正在使用华为耳机听音乐!");
    }
}

说明:华为耳机类,具体产品角色。

类HuaWeiPhone:

public class HuaWeiPhone implements Phone {

    @Override
    public void call() {
        System.out.println("正在使用华为手机打电话!");
    }
}

说明:华为手机类,具体产品角色。

类SanXingHeadset:

public class SanXingHeadset implements Headset {

    @Override
    public void listen() {
        System.out.println("正在使用三星耳机听音乐!");
    }
}

说明:三星耳机类,具体产品角色。

类SanXingPhone:

public class SanXingPhone implements Phone {


    @Override
    public void call() {
        System.out.println("正在使用三星手机打电话!");
    }
}

说明:三星手机类,具体产品角色。

类AbstractFactoryTest:

public class AbstractFactoryTest {

    public static void main(String[] args) {
        ElectronicFactory electronicFactory = new SanXingFactory();
        Headset sanXingHeadset = electronicFactory.createHeadset();
        sanXingHeadset.listen();
        Phone sanxingPhone = electronicFactory.createPhone();
        sanxingPhone.call();
        electronicFactory = new HuaWeiFactory();
        Headset huaWeiHeadset = electronicFactory.createHeadset();
        huaWeiHeadset.listen();
        Phone huaWeiPhone = electronicFactory.createPhone();
        huaWeiPhone.call();
    }
}

说明:测试以及客户端类。

 

四、优缺点

优:此模式与工厂方式模式类似,只不过该模式生产的是多种类产品。如果产品种类不变,则可无限拓展。

缺:当新增一个产品种类时,所有的具体工厂都需要改变,改动代码量大。

五、适用场景

1.适用于创建一系列相关的产品族使用。

六、其它

注意:抽象工厂模式并不完全符合开闭原则,在该模式中工厂是符合开闭原则,但产品种类是不符合开闭原则。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值