每日设计模式-抽象工厂模式

定义

是一种为访问类提供一个创建一组相关或者相互依赖对象的接口,且访问类无需指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

使用抽象工厂模式一般要满足以下条件。
系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
系统一次只可能消费其中某一族产品,即同族的产品一起使用。

抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下。
可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。

其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。

抽象工厂模式的主要角色:

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。
  • 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品
  • 具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它通具体工厂之间是多对一的关系。

代码理解

抽象工厂(Abstract Factory),电器城

public interface ElectronicMall {
    /**
     * 抽象工厂,电器城里可以卖电脑,也可以卖手机
     * 手机和电脑是抽象产品,因为手机和电脑都有多种不同品牌
     */
    public MobilePhone getMobilePhone();
    public Computer getComputer();
}

具体工厂(Concrete Factory),实现了产品的生成方式

public class ShanghaiElectronicMall implements ElectronicMall{
    /**
     * 具体工厂 上海电器城,卖华为手机和联想电脑
     */
    @Override
    public MobilePhone getMobilePhone() {
        System.out.println("Shanghai sell Huawei mobile phone");
        return new HuaweiMobilePhone();
    }

    @Override
    public Computer getComputer() {
        System.out.println("Shanghai sell Lenovo Computer");
        return new LenovoComputer();
    }
}

public class BeijingElectronicMall implements ElectronicMall{
    /**
     * 具体工厂 北京电器城,卖手机,卖电脑
     */
    @Override
    public MobilePhone getMobilePhone() {
        System.out.println("Beijing sell Xiaomi mobile phone");
        return new XiaomiMobilePhone();
    }

    @Override
    public Computer getComputer() {
        System.out.println("Beijing sell Huipu Computer");
        return new HPComputer();
    }
}

抽象产品,手机和电脑

public interface MobilePhone {
    void show();
}

public interface Computer {
    void show();
}

具体产品

public class XiaomiMobilePhone implements MobilePhone{
    /**
     * 具体产品 小米手机
     */
    @Override
    public void show() {
        System.out.println("Xiaomi Mobile Phone");
    }
}
public class HuaweiMobilePhone implements MobilePhone{
    /**
     * 具体产品 华为手机
     */
    @Override
    public void show() {
        System.out.println("Huawei Mobile phone");
    }
}
public class LenovoComputer implements Computer{
    /**
     * 具体产品 联想电脑
     */
    @Override
    public void show() {
        System.out.println("Lenove Computer");
    }
}
public class HPComputer implements Computer{
    /**
     * 具体产品 惠普电脑
     */
    @Override
    public void show() {
        System.out.println("Huipu Computer");
    }
}

用户,消费者,到具体工厂(具体电器城)买电器

public class Consumer {

    /**
     * 消费者,用户,到具体电器城购买手机和电脑
     */

    public static void main(String[] args) {
        ElectronicMall beijin = new BeijingElectronicMall();
        MobilePhone buyNewMobilePhone = beijin.getMobilePhone();
        buyNewMobilePhone.show();
        Computer buyNewComputer = beijin.getComputer();
        buyNewComputer.show();

        ElectronicMall shanghai = new ShanghaiElectronicMall();
        MobilePhone buySecondMobilePhone = shanghai.getMobilePhone();
        buySecondMobilePhone.show();
        Computer buySecondComputer = shanghai.getComputer();
        buySecondComputer.show();
    }
}

得到结果

Beijing sell Xiaomi mobile phone
Xiaomi Mobile Phone
Beijing sell Huipu Computer
Huipu Computer
Shanghai sell Huawei mobile phone
Huawei Mobile phone
Shanghai sell Lenovo Computer
Lenove Computer

Process finished with exit code 0

抽象工厂模式应用场景

抽象工厂模式通常适用于以下场景:

  • 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
  • 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
  • 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值