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

工厂方法模式简介

工厂方法模式 : 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 正在拨打电话。。。
相关推荐
孟陬1 天前
国外技术周刊 #3:“最差程序员”带动高效团队、不写代码的创业导师如何毁掉创新…
前端·后端·设计模式
砍光二叉树1 天前
【设计模式】结构型-代理模式
设计模式·系统安全·代理模式
新缸中之脑2 天前
AI智能体五大设计模式
人工智能·机器学习·设计模式
砍光二叉树2 天前
【设计模式】结构型-装饰器模式
设计模式·装饰器模式
han_2 天前
JavaScript设计模式(三):代理模式实现与应用
前端·javascript·设计模式
我的offer在哪里2 天前
POM 设计模式深度解析|博客视角:从原理到落地,让自动化测试脚本 “活” 起来
设计模式
程序员Terry2 天前
Java 代理模式:从生活中的"中介"到代码中的"代理人"
后端·设计模式
砍光二叉树2 天前
【设计模式】结构型-适配器模式
设计模式·适配器模式
Yu_Lijing2 天前
基于C++的《Head First设计模式》笔记——蝇量模式
c++·笔记·设计模式
敲代码的约德尔人2 天前
JavaScript 设计模式完全指南
javascript·设计模式