设计模式-工厂方法模式

定义

定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。(定义来源百度)

模式的角色与类图

学设计模式个人觉得当说到一个模式时,脑子中立刻可以浮现出对应的角色和类图是非常有必要的。

角色

相对于简单工厂多出了一个接口,具体角色如下:

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
  • 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

类图

在这里插入图片描述

具体代码如下:

/**
 * @author hao
 * 抽象产品接口
 */
public interface Phone {
    String getName();
    void call();
}
/**
 * @author hao
 * 具体产品1
 */
public class HuaweiPhone implements Phone{
    @Override
    public String getName() {
        return "华为手机";
    }

    @Override
    public void call() {
        System.out.println("华为手机打电话");
    }
}
/**
 * @author hao
 * 具体产品2
 */
public class XiaomiPhone implements Phone {
    @Override
    public String getName() {
        return "小米手机...";
    }

    @Override
    public void call() {
        System.out.println("小米手机打电话...");
    }
}

/**
 * @author hao
 * 抽象工厂
 */
public interface PhoneFactory {
    Phone createPhone();
}

/**
 * @author hao
 * 具体工厂1
 */
public class HuaweiPhoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {
        return new HuaweiPhone();
    }
}
/**
 * @author hao
 * 具体工厂2
 */
public class XiaomiPhoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {
        return new XiaomiPhone();
    }
}

我们使用测试代码进行测试,测试类代码如下:

public class MainTest {
    public static void main(String[] args){
        PhoneFactory pf = new XiaomiPhoneFactory();
        Phone xmphone = pf.createPhone();
        System.out.println(xmphone.getName());
        xmphone.call();
        
        PhoneFactory hwpf = new HuaweiPhoneFactory();
        Phone hwpfPhone = hwpf.createPhone();
        System.out.println(hwpfPhone.getName());
        hwpfPhone.call();

    }
}

测试结果如下:

小米手机…
小米手机打电话…
华为手机
华为手机打电话

优缺点分析

优点

符合开闭原则,新增产品时无需修改工厂类代码,只需新增一个产品的实现工厂。

缺点

新增一个产品就新增一个工厂类,会增加系统的复杂度。

Spring框架的就是使用该模式来生产bean的。具体的SpringIOC的原理会在后面的文章中分析到。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值