首页 > 其他分享 >设计模式——工厂模式

设计模式——工厂模式

时间:2025-01-12 19:59:14浏览次数:3  
标签:people 创建 模式 public 抽象 工厂 设计模式 eat

工厂模式


工厂模式(Factory Pattern) 是软件工程中的一种创建型设计模式。
使用工厂模式可以将对象的创建与使用分离,也就是说,客户端代码不需要知道具体创建的是哪种类型的对象,只需要关心对象的接口或抽象类即可。

工厂模式主要分为三种

简单工厂模式(Simple Factory)
工厂方法模式(Factory Method)
抽象工厂模式(Abstract Factory)

实现工厂模式的方法

前置条件

1、工厂模式的前提需要以下两个部分
Product (产品接口): 定义了所有具体产品所共有的接口或抽象类。
ConcreteProduct (具体产品): 实现了Product接口的具体类。

2、演示代码:
定义people(人)的接口,相当于Product (产品接口)
定义student(学生)类实现people接口,相当于ConcreteProduct (具体产品)
定义teacher(教师)类实现people接口,相当于ConcreteProduct (具体产品)

//定义people(人)的接口,相当于Product (产品)
public interface People {
	// 吃方法
    void eat();
}

//定义student(学生)类实现people接口,相当于ConcreteProduct (具体产品)
public class Student implements People {
    //重写eat方法
    @Override
    public void eat() {
        System.out.println("student eat");
    }
}

//定义teacher(教师)类实现people接口,相当于ConcreteProduct (具体产品)
public class Teacher implements People{
    //重写eat()
    @Override
    public void eat() {
        System.out.println("Teacher eat");
    }
}

简单工厂模式(Simple Factory)

1、简单工厂模式的结构
Product (产品接口): 定义了所有具体产品所共有的接口或抽象类。
ConcreteProduct (具体产品): 实现了Product接口的具体类。
Factory (工厂类): 包含一个静态方法(通常是public static),根据输入参数决定创建哪个具体的产品实例,并返回该实例。

2、演示代码:
定义工厂类(SimpleFactory),根据输入参数,生产不同类型的人(产品)

/*
* 简单工厂模式
*/
public class SimpleFactory {
    /*
    * 根据传入的参数,创建不同的对象
    * People是产品接口
    * Student和Teacher是People的实现类,也就是具体产品
    */
    public static People createPeople(String type) {
        switch (type) {
            case "student":
                return new Student();
            case "teacher":
                return new Teacher();
            default:
                throw new IllegalArgumentException("Unknown people type");
        }
    }
}

3、测试:

public class Main {
    //简单工厂模式测试
  public static void main(String[] args) {
        SimpleFactory simpleFactory = new SimpleFactory();
        simpleFactory.createPeople("student").eat();
        simpleFactory.createPeople("teacher").eat();
        simpleFactory.createPeople("other" ).eat();
    }
}

4、结果:
在这里插入图片描述

工厂方法模式(Factory Method)

1、工厂方法模式的结构
Product (产品接口): 定义了所有具体产品所共有的接口或抽象类。
ConcreteProduct (具体产品): 实现了Product接口的具体类。
Creator (创建者/工厂): 包含一个返回类型为Product的工厂方法,通常这个方法是抽象的,由具体的工厂去实现。
ConcreteCreator (具体创建者/具体工厂): 实现了工厂方法,负责创建具体产品的实例。
2、演示代码:
2.1、定义MethodPattern抽象类作为Creator (创建者/工厂),其中创建抽象的创建people的方法为抽象方法,统一调用people的eat方法为模板方法。
2.2、定义StudentMethodPattern类作为ConcreteCreator (具体创建者/具体工厂),继承MethodPattern抽象类并重写其中的抽象方法。
2.3、定义TeacherMethodPatten类作为ConcreteCreator (具体创建者/具体工厂),继承MethodPattern抽象类并重写其中的抽象方法。

/*
* 方法模式工厂
* 创建抽象的工厂类
*/
public abstract class MethodPattern {
    // 创建抽象的创建people的方法,抽象方法
    public abstract People createPeople();
    //创建统一调用people的eat方法,模板方法
    public void peopleEat() {
        People people = createPeople();
        people.eat();
    }
}

/*
* 学生的工厂类
* 继承抽象的工厂类
*/
public class StudentMethodPattern extends MethodPattern{
    //重写赋值方法,完成people对象的赋值,返回学生对象
    @Override
    public People createPeople() {
        return new Student();
    }
}


/*
 * 教师的工厂类
 * 继承抽象的工厂类
 */
public class TeacherMethodPatten extends MethodPattern{
    //重写赋值方法,完成people对象的赋值,返回教师对象
    @Override
    public People createPeople() {
        return new Teacher();
    }
}

3、测试:

public class Main {
    //方法模式测试
  public static void main(String[] args) {  
     //通过学生的工厂创建对应的pstudent对象,调用其中的eat方法
     new StudentMethodPattern().createPeople().eat();
     new TeacherMethodPatten().createPeople().eat();
    }
}

4、结果:
在这里插入图片描述

抽象工厂模式(Abstract Factory)

1、工厂方法模式的结构
Product (产品接口): 定义了所有具体产品所共有的接口或抽象类。
ConcreteProduct (具体产品): 实现了Product接口的具体类。
AbstractFactory (抽象工厂): 定义了一个接口,用于创建一组相关或依赖的对象,但没有指定具体的产品类。通常包含多个创建产品的抽象方法。
ConcreteFactory (具体工厂): 实现了AbstractFactory接口,负责创建具体产品族中的所有产品实例。
Client (客户端): 只依赖于抽象工厂和抽象产品接口,而不直接依赖任何具体工厂或具体产品类。
2、演示代码:
2.1、定义AbstractFactory接口作为AbstractFactory (抽象工厂),将创建People方法抽象出来。
2.2、定义StudentAbstractFactory类,实现AbstractFactory接口,作为ConcreteFactory (具体工厂),重写其中的创建people的方法,返回学生对象。
2.3、定义TeacherAbstractFactory类,实现AbstractFactory接口,作为ConcreteFactory (具体工厂),重写其中的创建people的方法,返回教师对象。
2.4、定义Client类,作为Client (客户端)。创建构造方法,传入工厂,通过传入不同的工厂,给people赋值不同的实体对象。同时调用实体对象的eat方法。

//抽象工厂方法
public interface AbstractFactory {
   //将创建People方法抽象出来。
   People createPeople();
}

/*
*学生的抽象工厂实现
*/
public class StudentAbstractFactory implements AbstractFactory{
    //重写其中的创建people的方法,返回学生对象。
    @Override
    public People createPeople() {
        return new Student();
    }
}


/*
 *教师的抽象工厂实现
 */
public class TeacherAbstractFactory implements AbstractFactory{
    //重写其中的创建people的方法,返回教师对象。
    @Override
    public Teacher createPeople() {
        return new Teacher();
    }
}


/**
 *工厂的客户端
 **/
public class Client {
    //定义私有化的people
    private People people;
    //构造方法,传入工厂,通过传入不同的工厂,给people赋值不同的实体对象
    public Client(AbstractFactory factory){
        this.people = factory.createPeople();
    }
    //调用实体对象的eat方法
    public void eat(){
        people.eat();
    }
}

3、测试:

public class Main {
    //测试抽象工厂模式
    public static void main(String[] args) {
        //通过抽象工厂创建学生的对象,调用其中的eat方法
        Client TeacherClient = new Client(new TeacherAbstractFactory());
        TeacherClient.eat();
        //通过抽象工厂创建教师的对象,调用其中的eat方法
        Client StudentClient = new Client(new StudentAbstractFactory());
        StudentClient.eat();
    }
}

4、结果:
在这里插入图片描述

应用场景

简单工厂模式:
1、配置文件解析器选择: 根据配置文件的类型(如XML、JSON、YAML),使用简单工厂模式来创建相应的解析器。
2、支付网关集成:在一个电子商务平台中,根据用户选择的支付方式(如信用卡、PayPal、支付宝)动态地创建对应的支付处理器。
3、日志记录器管理: 根据环境(开发、测试、生产)选择不同的日志记录方式(如控制台输出、文件记录、远程服务器发送)。

工厂方法模式:
1、数据库连接池:根据应用程序配置或运行时参数,选择适当的数据库类型(如MySQL、PostgreSQL、Oracle),并创建相应的数据库连接实例。
2、报表生成工具:依据用户需求生成不同格式的报告(如PDF、Excel、Word),每个格式由特定的工厂方法创建。

抽象工厂模式
1、多平台GUI库:为跨多个操作系统的桌面应用程序创建统一的用户界面组件集,保证所有组件来自同一个家族,以维持一致的外观和行为。
2、游戏开发中的角色和敌人生成:根据不同关卡或玩家选择的角色类型,创建一系列相关的游戏角色或敌人,保持游戏内部的一致性和规则性。
3、插件系统:允许第三方开发者为应用程序添加额外的功能模块(如编辑器插件、IDE扩展)。每个插件可以有自己的服务或工具窗口,但都遵循一套共同的接口规范。

总结

简单工厂模式
优点:
简化客户端代码:客户端不需要直接实例化具体的产品类,只需调用工厂类的方法即可获取所需的对象。
集中管理创建逻辑:所有创建逻辑集中在工厂类中,便于维护和调试。
易于理解和实现:概念简单,容易上手,适合快速原型开发。
缺点:
违反开闭原则:每当添加新产品类型时,需要修改工厂类中的创建逻辑,这违背了面向对象设计的开闭原则(对扩展开放,对修改关闭)。
职责过重:随着产品类型的增加,工厂类可能会变得庞大且难以维护。

工厂方法模式
优点:
支持开闭原则:通过新增具体工厂类和具体产品类来扩展系统,而无需改动现有代码,符合开闭原则。
灵活性高:允许子类决定应该实例化哪一个具体的产品类,从而将对象的创建与使用解耦。
易于扩展:可以轻松地向系统中添加新的产品类型,只需添加相应的具体工厂类和具体产品类即可。
缺点:
引入额外的类:增加了系统的复杂度,因为需要为每个具体产品创建对应的工厂类。
潜在的重复代码:如果多个工厂类之间的差异很小,可能会导致代码冗余。

抽象工厂模式
优点:
创建一系列相关对象:非常适合创建一系列相关或相互依赖的对象,确保它们属于同一个家族或主题。
保持一致性:保证所有相关的对象都是一致的,并且遵循相同的规则,特别适用于多平台或多个主题的支持。
高度灵活:可以在运行时动态地改变整个产品系列,而不需要修改客户端代码。
缺点:
复杂度较高:相比其他工厂模式,抽象工厂模式更为复杂,增加了理解成本。
实现难度大:实现抽象工厂模式可能需要更多的前期工作,并且在小型项目中可能显得过于繁琐。

总结
简单工厂模式适合小型项目或需求不明确的情况,它简化了对象创建过程,但不太适合长期维护的大规模应用。
工厂方法模式则更适合大型项目,尤其是在需要扩展新功能而不改变现有代码的情况下,它提供了更好的灵活性和可维护性。
抽象工厂模式适用于需要创建一系列相关对象的场景,特别是当这些对象必须保持一致性和相互依赖时,它可以确保所有相关对象都来自同一个家族。

标签:people,创建,模式,public,抽象,工厂,设计模式,eat
From: https://blog.csdn.net/weixin_49845828/article/details/145027942

相关文章

  • 设计模式——单例模式
    单例模式实现单例模式的方法前置条件懒汉式(LazyInitialization)饿汉式(EagerInitialization)双重锁式(Double-CheckedLocking)静态内部类式(StaticInnerClass)枚举式(Enum)总结单例模式(SingletonPattern)是软件工程中的一种设计模式,它确保一个类只有一个实例,并提供一个全......
  • Python 基础知识 之 选择(分支)结构 + 模式匹配结构(match)
    选择结构按照条件选择执行不同的代码段1.单分支结构if语法结构执行流程:如果表达式的值为True,就执行语句块,如果表达式的值为False,就跳过语句块,继续执行下面的语句⭐注意:⭐⭐⭐表达式后面的冒号;缩进,python中通过缩进来控制程序逻辑示例;#1.判断是否中奖nu......
  • 【论文复现】基于区块链的分布式光伏就地消纳交易模式研究(Matlab代码实现)
    ......
  • ecmascript 标准+ 严格模式与常规模式 + flat-flatMap 应用
    文章目录ecmascript历程严格模式与常规模式下的区别及注意事项严格模式下的属性删除Array.prototype.flat()和Array.prototype.flatMap()实例应用ecmascript历程变量声明要求常规模式:在常规模式下,使用var关键字声明变量时会出现变量提升现象。这意味着变......
  • 学英语学压测:07 jmeter 三种运行模式:GUI、命令行、Server
    ......
  • Sigrity System SI SerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Rx_Dev
    SigritySystemSISerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Rx_DeviceSigritySystemSISerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以及该协议......
  • Sigrity System SI SerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Tx_Hos
    SigritySystemSISerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Tx_HostSigritySystemSISerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以及该协议需......
  • 【Rust】枚举与模式匹配
    目录思维导图一、概述1.枚举的定义与使用2.特殊枚举:Option4.模式匹配5.iflet构造二、枚举1.枚举的定义与作用2.IP地址的枚举示例示例代码3.结构体与枚举的组合示例代码4.枚举变体的灵活性示例代码5.枚举的方法代码示例:6.Option枚举的优势标准库......
  • Java常用设计模式
    单例模式单例模式就是:在程序运行期间,某些类有且最多只有一个实例对象饿汉模式(静态常量)饥饿模式又称为饿汉模式,指的是JVM在加载类的时候就完成类对象的创建//饿汉式(静态常量)publicclassSingleton1{//构造器私有化,外部不能newprivateSingleton1(......
  • 【设计模式与体系结构】结构型模式-外观模式
    引言昨夜见军帖,可汗大点兵,军书十二卷,卷卷有爷名。阿爷无大儿,木兰无长兄,愿为市鞍马,从此替爷征。东市买骏马,西市买鞍鞯,南市买辔头,北市买长鞭。————《木兰诗节选》花木兰替父从军,欲买马、鞍鞯、辔头和长鞭,需要分别去往东市、西市、南市和北市。换言之,花木兰一人就得与四个贸易......