设计模式-创建型模式-工厂方法模式详解

工厂方法模式简介

工厂方法模式 : Factory Method Pattern : 是一种创建型模式
核心定义一个创建对象的接口,具体的创建对象的动作由子类实现
效果 : 工厂方法的模式,使得目标类的实例化过程延迟到了 工厂子类中

核心角色介绍

产品类 :要创建的目标类,也可以是接口类型; 比如 : 手机。
具体产品类 : 要创建的目标类的具体的类型; 比如 : 小米手机。
工厂类声明工厂方法,该方法返回的是产品类型的对象。可以包含其他业务逻辑,但并不负责创建具体的产品实例;比如 : 手机工厂。
具体工厂类 : 包含对具体产品的引用,并实现工厂类中的方法,以及返回产品对象;比如 : 小米手机工厂。

使用场景案例

场景介绍

复制代码
1、有一个 手机类型;
2、有 小米手机 和 华为手机 两个具体的手机类型;
3、有一个 手机工厂的 接口;
4、有小米手机工厂 和 华为手机工厂 两个具体的生产手机的工厂类,分别生产不同的具体类型的手机。

UML类图

具体代码实现

手机抽象类

java 复制代码
public abstract class Phone {

    /**
     * 手机品牌名称
     */
    protected String brandName;

    /**
     * 抽象方法 : 拨打电话
     */
   protected abstract void call();

    public Phone(String brandName) {
        this.brandName = brandName;
    }

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }
}

小米手机类

java 复制代码
public class XiaomiPhone extends Phone{

    public XiaomiPhone(String brandName) {
        super(brandName);
    }

    @Override
    protected void call() {
        System.out.println(brandName + " 正在拨打电话。。。");
    }
}

华为手机类

java 复制代码
public class HuaweiPhone extends Phone{
    public HuaweiPhone(String brandName) {
        super(brandName);
    }

    @Override
    protected void call() {
        System.out.println(brandName + " is calling ......");
    }
}

工厂接口

java 复制代码
public interface PhoneFactory {
	/**
	* 创建手机对象的方法
	*/
    Phone createPhone();
}

小米手机工厂

java 复制代码
public class XiaomiPhoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {
        return new XiaomiPhone("小米14");
    }
}

华为手机工厂

java 复制代码
public class HuaweiPhoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {
        return new HuaweiPhone("华为mate50");
    }
}

测试使用

java 复制代码
public class FactoryMethodPatternTest {
    public static void main(String[] args) {

        // 要创建的对象
        Phone phone = null;
        // 创建对象的工厂类
        PhoneFactory phoneFactory = null;

        String brandName = "xiaomi";
        // 根据条件,使用不同的具体的工厂类,进行对象的创建
        if (brandName.equals("huawei")){
            // 使用具体的工厂类进行对象的创建
            phoneFactory = new HuaweiPhoneFactory();
            phone = phoneFactory.createPhone();
        }else if (brandName.equals("xiaomi")){
            // 使用具体的工厂类进行对象的创建
            phoneFactory = new XiaomiPhoneFactory();
            phone = phoneFactory.createPhone();
        }

        // 调用 对象进行打电话
        phone.call();
    }
}
复制代码
运行结果 : 根据条件使用不同的工厂创建具体的手机对象:

小米14 正在拨打电话。。。
相关推荐
Overboom4 小时前
[C++] --- 常用设计模式
开发语言·c++·设计模式
@大迁世界7 小时前
Vue 设计模式 实战指南
前端·javascript·vue.js·设计模式·ecmascript
数据智能老司机11 小时前
数据工程设计模式——冷热数据存储
大数据·设计模式·架构
爱学习的小熊猫_12 小时前
设计模式之责任链模式
设计模式·责任链模式
闲不住的李先森12 小时前
乐观更新
前端·react.js·设计模式
数据智能老司机15 小时前
数据工程设计模式——实时摄取与处理
大数据·设计模式·架构
Asort18 小时前
JavaScript设计模式(七)——桥接模式:解耦抽象与实现的优雅之道
前端·javascript·设计模式
原则猫19 小时前
单例模式工程运用
前端·设计模式
charlie1145141911 天前
精读C++20设计模式:行为型设计模式:中介者模式
c++·学习·设计模式·c++20·中介者模式
虫师c1 天前
分布式系统设计模式:从理论到实践
微服务·设计模式·系统架构·高可用·分布式系统