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

工厂方法模式简介

工厂方法模式 : 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 正在拨打电话。。。
相关推荐
七月丶2 天前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞2 天前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼2 天前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟3 天前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder3 天前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室3 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦4 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
BD_Marathon7 天前
工厂方法模式
android·java·工厂方法模式
青春易逝丶7 天前
工厂方法模式
工厂方法模式