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

工厂方法模式简介

工厂方法模式 : 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 正在拨打电话。。。
相关推荐
周杰伦_Jay2 小时前
【常用设计模式全解析】创建型模式(聚焦对象创建机制)、结构型模式(优化类与对象的组合关系)、行为型模式(规范对象间的交互行为)
设计模式·架构·开源·交互·1024程序员节
橙色云-智橙协同研发2 小时前
PLM实施专家宝典:离散制造企业研发数据“数字基因”构建方案
经验分享·工厂方法模式·解决方案·数字化转型·plm·国产plm·plm方案
杯莫停丶4 小时前
设计模式之:外观模式
java·设计模式·外观模式
杯莫停丶5 小时前
设计模式之:命令模式
设计模式·命令模式·1024程序员节·活动勋章
电子科技圈7 小时前
芯科科技推出智能开发工具Simplicity Ecosystem软件开发套件开启物联网开发的新高度
mcu·物联网·设计模式·软件工程·软件构建·iot·1024程序员节
WaWaJie_Ngen8 小时前
【设计模式】组合模式(Composite)
设计模式·组合模式·1024程序员节
WaWaJie_Ngen10 小时前
【设计模式】装饰器模式(Decorator)
设计模式·装饰器模式
YuanlongWang10 小时前
C# 设计模式——观察者
windows·设计模式·c#
亿牛云爬虫专家10 小时前
中间件实现任务去重与精细化分发:设计模式与常见陷阱
设计模式·中间件·爬虫代理·数据抓取·商品信息·数据去重·电商搜索
消失的旧时光-19431 天前
kmp需要技能
android·设计模式·kotlin