创建型模式——工厂方法模式

本文介绍了工厂方法模式,相较于简单工厂模式,它将产品创建职责分配给具体的工厂类。通过实例化苹果、华为和小米手机的工厂,展示了如何在不修改原有代码的基础上增加新产品。工厂方法模式提高了代码的灵活性,降低了耦合度,适用于当客户只需知道工厂名称而不关心产品细节的场景。
摘要由CSDN通过智能技术生成

一、介绍

相对于简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,也就是定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。

二、案例

依然采用模拟手机制造举例说明:

  • 手机制造标准
/**
 * 手机制造标准
 *
 * @author zhangxs
 **/
public interface Phone {
    void make();
}
  • 苹果手机具体制造实现
/**
 * 苹果手机
 *
 * @author zhangxs
 **/
public class ApplePhone implements Phone {
    public ApplePhone() {
        this.make();
    }

    @Override
    public void make() {
        System.out.println("已制造苹果手机...");
    }
}
  • 华为手机具体制造实现
/**
 * 华为手机
 *
 * @author zhangxs
 **/
public class HuaweiPhone implements Phone {
    public HuaweiPhone() {
        this.make();
    }

    @Override
    public void make() {
        System.out.println("已制造华为手机...");
    }
}
  • 小米手机具体制造实现
/**
 * 小米手机
 *
 * @author zhangxs
 **/
public class XiaomiPhone implements Phone {
    public XiaomiPhone() {
        this.make();
    }

    @Override
    public void make() {
        System.out.println("已制造小米手机...");
    }
}
  • 抽象手机工厂
/**
 * 抽象手机工厂
 *
 * @author zhangxs
 **/
public interface PhoneFactory {
    Phone makePhone();
}
  • 生产苹果手机的工厂
/**
 * 苹果手机代工厂
 *
 * @author zhangxs
 **/
public class AppleFactory implements PhoneFactory {
    @Override
    public Phone makePhone() {
        return new ApplePhone();
    }
}
  • 生产华为手机的工厂
/**
 * 华为手机代工厂
 *
 * @author zhangxs
 **/
public class HuaweiFactory implements PhoneFactory {
    @Override
    public Phone makePhone() {
        return new HuaweiPhone();
    }
}
  • 生产小米手机的工厂
/**
 * 小米手机代工厂
 *
 * @author zhangxs
 **/
public class XiaomiFactory implements PhoneFactory {
    @Override
    public Phone makePhone() {
        return new XiaomiPhone();
    }
}
  • 测试
/**
 * 测试
 *
 * @author zhangxs
 **/
public class Test {
    public static void main(String[] args) {
        PhoneFactory xiaomiFactory = new XiaomiFactory();
        xiaomiFactory.makePhone();
        PhoneFactory appleFactory = new AppleFactory();
        appleFactory.makePhone();
        PhoneFactory huaweiFactory = new HuaweiFactory();
        huaweiFactory.makePhone();
    }
}

三、总结

  • 优点:
    1、用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
    2、灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
    3、典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
  • 缺点:
    1、类的个数容易过多,增加复杂度
    2、增加了系统的抽象性和理解难度
    3、抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。
  • 适用场景:
    1、客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
    2、创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
    3、客户不关心创建产品的细节,只关心产品的品牌
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值