设计模式--工厂方法

工厂方法模式

主要用于生成复杂对象,如果只通过new就可以完事,就不用该模式。这个模式看起来简单,但感觉很难理解,不晓得存在的意义是什么,都知道子类名称了为什么不直接new(或许是实际创建比较复杂,例子都偷懒使用简单的类型,所以可以直接new就完成对象创建了)都拿到Class 自己通过反射也可以直接拿到对象实例,和在工厂中使用反射生成有什么区别?

工厂一般来说都生成一类相似的产品,比如说罐头工厂,生产黄桃罐头、杨梅罐头、凤梨罐头。客户通过工厂对外的接口来获得自己想要的产品。

  • 对客户而言,需要知道这个产品能干什么(抽象产品接口)已经从哪里获得(抽象工厂接口)自己想要的(传入参数表明自己意图)产品。
  • 对于工厂而言,需要实现具体生产组装产品的细节,还需要了解客户意图,使用具体对应工厂,返回具体产品。

主要角色

  • 抽象工厂:工厂模式的核心
  • 具体工厂:实现具体逻辑
  • 抽象产品:是工厂所生产产品的基类,规定了这些产品的公共特征
  • 具体产品: 实现抽象产品的某个具体类

具体实现

这里有两种实现方案,第一种使用泛型,也是让我困惑的方式。第二种使用字符串或枚举实现

1.泛型方式

  • 抽象产品
public abstract class AudiCar {
    public abstract void drive();
    public abstract void selfNavigation();
}
  • 具体产品
public class AudiQ3 extends AudiCar {
    @Override
    public void drive() {
        System.out.println("Q3 启动了");
    }
    @Override
    public void selfNavigation() {
        System.out.println("Q3 开始自动巡航!");
    }
}

public class AudiQ5 extends AudiCar {
    @Override
    public void drive() {
        System.out.println("Q5 启动了!");
    }
    @Override
    public void selfNavigation() {
        System.out.println("Q5 开启自动巡航!");
    }
}

public class AudiQ7 extends AudiCar {
    @Override
    public void drive() {
        System.out.println("Q7 启动了!");
    }
    @Override
    public void selfNavigation() {
        System.out.println("Q7 开启自动巡航!");
    }
}
  • 抽象工厂
public abstract class AudiFactory {
    public abstract <T extends AudiCar> T createAudiCar(Class<T> T);
}
  • 具体工厂
public class AudiCarFactory extends AudiFactory {
    @Override
    public <T extends AudiCar> T createAudiCar(Class<T> clz) {
        AudiCar car=null;
        try {
            car= (AudiCar) Class.forName(clz.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T) car;
    }
}
  • 客户端使用
public class Client {
    public static void main(String[] args) {
        AudiFactory audiFactory = new AudiCarFactory();
        AudiCar audiCarq3 = audiFactory.createAudiCar(AudiQ3.class);
        AudiCar audiCarq5 = audiFactory.createAudiCar(AudiQ5.class);
        AudiCar audiCarq7 = audiFactory.createAudiCar(AudiQ7.class);

        audiCarq3.drive();
        audiCarq3.selfNavigation();
        audiCarq5.drive();
        audiCarq5.selfNavigation();
        audiCarq7.drive();
        audiCarq7.selfNavigation();
    }
}

这种方式客户端都已经用到“实现类.class”了,客户端都其实已经知道了具体产品类的实现细节。

2.使用约定名称或枚举

  • 抽象产品
public interface Can {
    void open();
    String createDate();
}
  • 具体产品
public class PeachCan implements Can {
    public PeachCan() {  }
    @Override
    public void open() {
        System.out.println("PeachCan被打开!");
    }
    @Override
    public String createDate() {
        return null;
    }
}

public class BayberryCan implements Can{
    public BayberryCan() { }
    @Override
    public void open() {
        System.out.println("Bayberry 被打开了!");
    }
    @Override
    public String createDate() {
        return null;
    }
}

public class AnanasCan implements Can {
    public AnanasCan() {  }
    @Override
    public void open() {
        System.out.println("Ananas被打开了!");
    }
    @Override
    public String createDate() {
        return null;
    }
}

  • 抽象工厂
public interface Factory {
    Can getCan(String canName);
    Can getCan(CanTypes type);
    void doSomething();
}
  • 具体工厂
public class CanFactory implements Factory {
    public CanFactory() {  }

    @Override
    public Can getCan(String canName) {
        if (canName.isEmpty()) {
            return null;
        }
        if (canName.equals("peach")) {
            return new PeachCan();
        } else if (canName.equals("bayberry")) {
            return new BayberryCan();
        } else if (canName.equals("ananas")) {
            return new AnanasCan();
        } else {
            return null;
        }
    }

    @Override
    public Can getCan(CanTypes type) {
        switch (type) {
            case PEACH:
                return new PeachCan();
            case ANANAS:
                return new AnanasCan();
            case BAYBERRY:
                return new BayberryCan();
            default:
                return null;
        }
    }

    @Override
    public void doSomething() {
        System.out.println("工厂 doSomething");
    }
}
  • 约定枚举
public enum CanTypes {
    PEACH,
    BAYBERRY,
    ANANAS;
}

这里使用字符串(张口说“我要个黄桃罐头”)或枚举(看着工厂给的菜单选)更符合实际情况,客户端只需要知道 抽象工厂接口、产品接口,具体产品对应的枚举类。 不需要知道任何具体实现,更符合迪米特原则。

工厂模式更侧重的是如何方便的给和客户端提供产品,而不是具体产品的组装。

Call接口提供了内部接口Factory(用于将对象的创建延迟到该工厂类的子类中进行,从而实现动态的
配置,工厂方法模式。(工厂方法模式:这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。)

内容概要:本文详细介绍了一个基于C++的养老院管理系统的设计与实现,旨在应对人口老龄化带来的管理挑战。系统通过整合住户档案、健康监测、护理计划、任务调度等核心功能,构建了从数据采集、清洗、AI风险预测到服务调度与可视化的完整技术架构。采用C++高性能服务端结合消息队列、规则引擎和机器学习模型,实现了健康状态实时监控、智能任务分配、异常告警推送等功能,并解决了多源数据整合、权限安全、老旧硬件兼容等实际问题。系统支持模块化扩展与流程自定义,提升了养老服务效率、医护协同水平和住户安全保障,同时为运营决策提供数据支持。文中还提供了关键模块的代码示例,如健康指数算法、任务调度器和日志记录组件。; 适合人群:具备C++编程基础,从事软件开发或系统设计工作1-3年的研发人员,尤其是关注智慧养老、医疗信息系统开发的技术人员。; 使用场景及目标:①学习如何在真实项目中应用C++构建高性能、可扩展的管理系统;②掌握多源数据整合、实时健康监控、任务调度与权限控制等复杂业务的技术实现方案;③了解AI模型在养老场景中的落地方式及系统架构设计思路。; 阅读建议:此资源不仅包含系统架构与模型描述,还附有核心代码片段,建议结合整体设计逻辑深入理解各模块之间的协同机制,并可通过重构或扩展代码来加深对系统工程实践的掌握。
内容概要:本文详细介绍了一个基于C++的城市交通流量数据可视化分析系统的设计与实现。系统涵盖数据采集与预处理、存储与管理、分析建模、可视化展示、系统集成扩展以及数据安全与隐私保护六大核心模块。通过多源异构数据融合、高效存储检索、实时处理分析、高交互性可视化界面及模块化架构设计,实现了对城市交通流量的实时监控、历史趋势分析与智能决策支持。文中还提供了关键模块的C++代码示例,如数据采集、清洗、CSV读写、流量统计、异常检测及基于SFML的柱状图绘制,增强了系统的可实现性与实用性。; 适合人群:具备C++编程基础,熟悉数据结构与算法,有一定项目开发经验的高校学生、研究人员及从事智能交通系统开发的工程师;适合对大数据处理、可视化技术和智慧城市应用感兴趣的技术人员。; 使用场景及目标:①应用于城市交通管理部门,实现交通流量实时监测与拥堵预警;②为市民出行提供路径优化建议;③支持交通政策制定与信号灯配时优化;④作为智慧城市建设中的智能交通子系统,实现与其他城市系统的数据协同。; 阅读建议:建议结合文中代码示例搭建开发环境进行实践,重点关注多线程数据采集、异常检测算法与可视化实现细节;可进一步扩展机器学习模型用于流量预测,并集成真实交通数据源进行系统验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值