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

工厂方法模式简介

工厂方法模式 : 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 正在拨打电话。。。
相关推荐
数据智能老司机8 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机9 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴12 小时前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤12 小时前
工厂模式
设计模式
幂简集成explinks1 天前
e签宝签署API更新实战:新增 signType 与 FDA 合规参数配置
后端·设计模式·开源
大飞pkz2 天前
【设计模式】C#反射实现抽象工厂模式
设计模式·c#·抽象工厂模式·c#反射·c#反射实现抽象工厂模式
努力也学不会java2 天前
【设计模式】抽象工厂模式
java·设计模式·oracle·抽象工厂模式
青草地溪水旁2 天前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(2)
c++·设计模式·抽象工厂模式
青草地溪水旁2 天前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(1)
c++·设计模式·抽象工厂模式
Magnetic_h2 天前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa