首页 > 其他分享 >设计模式—创建型模式之工厂模式

设计模式—创建型模式之工厂模式

时间:2023-10-30 19:48:00浏览次数:31  
标签:return 创建 模式 class AbstractCar 工厂 new 设计模式 public

设计模式—创建型模式之工厂模式

工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。

简单工厂模式

比如我们有造车的工厂,来生产车,我们先定义一个抽象车产品:

//抽象车产品类
public abstract class AbstractCar { 
    String engine;
    public abstract void run();
}

我们有两个具体的产品,货车和家用小汽车,都继承自抽象车:

//货车
public class Truck extends AbstractCar{
	public Truck() {
        this.engine = "货车引擎";
    }
    @Override
    public void run() {
        System.out.println(this.engine+"--->正在运行");
    }
}
//家用小汽车
public class MiniCar extends AbstractCar{
    public MiniCar() {
        this.engine = "家用小汽车引擎";
    }
    @Override
    public void run() {
        System.out.println(this.engine + "----------》正在运行");
    }
}

那我们的工厂可以如此定义:

public class MySimpleFactory {

   	/**
     * 获取车
     * @param type
     * @return
     */
    public AbstractCar newCar(String type){
        if("truck".equals(type)){
            return new Truck();
        }else if("mini".equals(type)){
            return new MiniCar();
        }

        return null;
    }
}

一般简单工厂生产的产品优先。

测试类如下:

public class SimpleFactoryTest {
    public static void main(String[] args) {
        MySimpleFactory factory = new MySimpleFactory();
        AbstractCar truck = factory.newCar("truck");
        AbstractCar mini = factory.newCar("mini");
        truck.run();
        mini.run();
    }
}

运行如下:

运行效果

缺点

违反了开闭原则,扩展不易。如果有大量的产品,会有大量的if else。

工厂方法模式

因为简单工厂模式,会出现大量的if else,并不能满足打开扩展、关闭修改的原则,我们希望,如果有扩展,直接扩展一个类就好,不区改动创造类型的代码,这样工厂方法模式就出现了。我们可以把工厂再进行抽象,把我们的工厂提升一个层次。

抽象类或者接口,就会有多个实现;有多实现 就会有多功能。

抽象工厂如下:

public abstract class AbstarctCarFactory {
    public abstract AbstractCar newCar();
}

我们的货车、小汽车,分别由不同的工厂来创建:

//货车工厂
public class TruckFactory extends AbstarctCarFactory {
    @Override
    public AbstractCar newCar() {
        return new Truck();
    }
}
//小汽车工厂
public class MiniCarFactory extends AbstarctCarFactory {
    @Override
    public AbstractCar newCar() {
        return new MiniCar();
    }
}

测试类如下:

public class FactoryMethodTest {
    public static void main(String[] args) {
        AbstarctCarFactory miniCarFactory = new MiniCarFactory();
        AbstractCar miniCar = miniCarFactory.newCar();
        miniCar.run();

        TruckFactory truckFactory = new TruckFactory();
        AbstractCar truck = truckFactory.newCar();
        truck.run();
    }
}

运行结果如下:

运行结果

这样,如果我们有新的类型,可以直接继承这个抽象工厂即可。

缺点

系统复杂度增加,可创建的品类单一。

抽象工厂模式

我们先来区分两个概念:

  • 产品等级:比如手机可以分为低配版手机、高配版手机;产品等级结构即产品的继承结构,如抽象类为手机,可以有拍照手机、游戏手机等等。
  • 产品族:产品可以分为手机、汽车等,这是产品族。在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。

在车的产品基础上,我们又增加了新的产品,手机。

public abstract class AbstractPhone {
    //手机类型
    String type;
    public abstract void run();
}

public class GamePhone extends AbstractPhone {
    public GamePhone() {
        this.type = "游戏手机";
    }
    @Override
    public void run() {
        System.out.println(this.type + "正在运行了...");
    }
}

public class MyPhotoPhoneFactory implements MyAbstarctFactory{
    @Override
    public AbstractPhone newPhone() {
        return new PhotoPhone();
    }
}

如果我们想生产车和手机,我们可以定义抽象工厂:

public interface  MyAbstarctFactory {
    default AbstractCar newCar(){
        return null;
    }
    default AbstractPhone newPhone(){
        return null;
    }
}

生产手机的工厂分别为:

public class MyGamePhoneFactory implements MyAbstarctFactory{
    @Override
    public AbstractPhone newPhone() {
        return new GamePhone();
    }
}
public class MyPhotoPhoneFactory implements MyAbstarctFactory{
    @Override
    public AbstractPhone newPhone() {
        return new PhotoPhone();
    }
}

生产车的工厂分别为:

public class MyMiniCarFactory implements MyAbstarctFactory{
    @Override
    public AbstractCar newCar() {
        return new MiniCar();
    }
}

public class MyTruckCarFactory implements MyAbstarctFactory{
    @Override
    public AbstractCar newCar() {
        return new Truck();
    }
}

测试类如下:

public class MyTest {
    public static void main(String[] args) {
        MyAbstarctFactory factory = new MyGamePhoneFactory();
        AbstractPhone abstractPhone = factory.newPhone();
        abstractPhone.run();

        factory = new MyMiniCarFactory();
        AbstractCar abstractCar = factory.newCar();
        abstractCar.run();
    }
}

运行如下:

运行结果

可以看到,我们在扩展时,都是新增类,而不是修改原有的方法。

标签:return,创建,模式,class,AbstractCar,工厂,new,设计模式,public
From: https://www.cnblogs.com/nicaicai/p/17798614.html

相关文章

  • 【Tomcat】解决tomcat创建文件和目录没有others权限问题
    最近公司有一个新的需求,就是用Java使用apachecommonexec执行ffmpeg进行ts文件切片。但是产生的切片文件总是没有others权限,导致无法使用http远程访问(做了反向代理)解决方案:在tomcat/bin目录下编辑catalina.sh文件查找umask=“0027”更改为umask=“0022”此时新生成的文件权限......
  • 生产者消费者模式下实现多batch延时推理
    生产者消费者模式下实现多batch延时推理需求分析在实际推理过程中为了实现较高的吞吐量和较高的资源利用率,往往会使用多线程来收集多次请求,并组合形成多batch下的模型推理,一种常见的实现便是生产者和消费者模式,其需求如下:生产者收集提交的请求,消费者对请求进行消费,并将结果返......
  • 设计模式-工厂方法(Factory Method)
    1.定义 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。2.示例创建一个接口:publicinterfaceShape{voiddraw();}创建接口具体实现类 publicclassSquareimplementsShape{@Overridepublicvoiddraw(){......
  • 如何使用VSCode创建编辑Markdown文件
    断更了这么久,我回来啦!!!目录如何使用VSCode创建编辑Markdown文件一、安装VSCode软件二、VSCode安装Markdown相关插件1、VSCode安装插件的步骤2、VSCode中与Markdown有关的插件3、插件安装完成后的效果图三、VSCode操作Markdown文件1、VSCode新建Markdown文件2、VSCode编辑Markdow......
  • 设计模式-装饰器模式
    目录设计模式-装饰器模式什么是装饰器设计模式?java示例设计模式-装饰器模式什么是装饰器设计模式?装饰器设计模式(DecoratorPattern)是一种结构型设计模式,它允许你通过将对象包装在一个装饰器类中来动态地扩展其功能。装饰器模式能够在不改变原有对象的情况下,通过添加新的装饰器类......
  • SQL Server数据库创建远程服务器备份计划(小白详细图文教程)
    一、前言最近项目系统做安全加固,以前是本地备份,现在需要做远程内网服务器数据库备份,后期也有可能做异地备份。下面以SQLServer2016内网服务器数据库备份为例,数据库服务器地址:192.168.10.200备份服务器地址:192.168.10.100二、创建存储文件夹192.168.10.100远程100服务器,创建......
  • Centos8进入单用户模式重置密码方法
    开机出现grubbootloader开机选项菜单时,立即点击键盘任意鍵,bootloader会暂停。按下e,编辑选项菜单,移动上下鍵至linux16核心命令行:加入rd.break。linux16/vmlinuz-3.10.0-123.el7.x86_64root=UUID=449d53d1-84c2-40c0-b05e-d1900591d71brord.lvm.lv=vg_kvm7usb/swapcra......
  • JavaScript 中的单例模式
    单例模式是JavaScript中最流行的设计模式之一。单例模式的优点全球访问点:提供对实例的单点访问,可以轻松管理全球资源。内存效率:该模式确保只有一个实例,这特别节省内存。延迟初始化:仅在需要时才创建实例,从而提高性能这是一种创建模式,可确保类只有一个实例,同时提供对该实例......
  • Redis的四种模式:单机、主从、哨兵、集群简介
    Redis的单机模式单机模式就是安装一个redis,启动起来,业务调用即可。具体安装步骤和启动步骤就不赘述了,单机在很多场景也是有使用的,例如在一个并非必须保证高可用的情况下。单机的优点:部署简单,0成本。成本低,没有备用节点,不需要其他的开支。高性能,单机不需要同步数据,数据......
  • 《软件需求模式》阅读笔记一
    《软件需求模式》阅读笔记与心得体会在阅读《软件需求模式》的前四章节之后,我对软件需求模式有了更深入的理解。这本书以实用为主,详细介绍了如何分析、设计、实现和测试软件需求,对于软件工程师来说,具有很高的参考价值。需求模式是软件开发过程中的重要环节,它描述了需求的类型、......