首页 > 编程语言 >java 工厂模式

java 工厂模式

时间:2024-02-14 12:55:39浏览次数:28  
标签:use java class Product 模式 工厂 Override new public

工厂模式(Factory Pattern)是 Java 中常用的一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

Java 中的工厂模式主要有三种:简单工厂模式(Simple Factory Pattern)、工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)。

1.简单工厂模式(Simple Factory Pattern)
简单工厂模式不属于 GoF 23 种设计模式,但它可以作为工厂方法模式的一个引导,有时候也被看作工厂方法模式的一种特例。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

public interface Product {  
    void use();  
}  
  
public class ConcreteProductA implements Product {  
    @Override  
    public void use() {  
        System.out.println("使用具体产品A");  
    }  
}  
  
public class ConcreteProductB implements Product {  
    @Override  
    public void use() {  
        System.out.println("使用具体产品B");  
    }  
}  
  
public class SimpleFactory {  
    public Product createProduct(String type) {  
        if ("A".equals(type)) {  
            return new ConcreteProductA();  
        } else if ("B".equals(type)) {  
            return new ConcreteProductB();  
        }  
        return null;  
    }  
}  
  
// 客户端代码  
SimpleFactory factory = new SimpleFactory();  
Product productA = factory.createProduct("A");  
productA.use();

2.工厂方法模式(Factory Method Pattern)
工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

public interface Product {  
    void use();  
}  
  
public class ConcreteProductA implements Product {  
    @Override  
    public void use() {  
        System.out.println("使用具体产品A");  
    }  
}  
  
public class ConcreteProductB implements Product {  
    @Override  
    public void use() {  
        System.out.println("使用具体产品B");  
    }  
}  
  
public interface Factory {  
    Product createProduct();  
}  
  
public class ConcreteFactoryA implements Factory {  
    @Override  
    public Product createProduct() {  
        return new ConcreteProductA();  
    }  
}  
  
public class ConcreteFactoryB implements Factory {  
    @Override  
    public Product createProduct() {  
        return new ConcreteProductB();  
    }  
}  
  
// 客户端代码  
Factory factoryA = new ConcreteFactoryA();  
Product productA = factoryA.createProduct();  
productA.use();  
  
Factory factoryB = new ConcreteFactoryB();  
Product productB = factoryB.createProduct();  
productB.use();

3.抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

public interface ProductA {  
    void use();  
}  
  
public interface ProductB {  
    void eat();  
}  
  
public class ConcreteProductA1 implements ProductA {  
    @Override  
    public void use() {  
        System.out.println("使用具体产品A1");  
    }  
}  
  
public class ConcreteProductA2 implements ProductA {  
    @Override  
    public void use() {  
        System.out.println("使用具体产品A2");  
    }  
}  
  
public class ConcreteProductB1 implements ProductB {  
    @Override  
    public void eat() {  
        System.out.println("使用具体产品B1");  
    }  
}  
  
public class ConcreteProductB2 implements ProductB {  
    @Override  
    public void eat() {  
        System.out.println("使用具体产品B2");  
    }  
}  
  
public interface AbstractFactory {  
    ProductA createProductA();  
    ProductB createProductB();  
}  
  
public class ConcreteFactory1 implements AbstractFactory {  
    @Override  
    public ProductA createProductA() {  
        return new ConcreteProductA1();  
    }  
  
    @Override  
    public ProductB createProductB() {  
        return new ConcreteProductB1();  
    }  
}  
  
public class ConcreteFactory2 implements AbstractFactory {  
    @Override  
    public ProductA createProductA() {  
        return new ConcreteProductA2();  
    }  
  
    @Override  
    public ProductB createProductB() {  
        return new ConcreteProductB2();  
    }  
}  
  
// 客户端代码  
AbstractFactory factory1 = new ConcreteFactory1();  
ProductA productA1 = factory1.createProductA();  
ProductB productB1 = factory1.createProductB();  
productA1.use();  
productB1.eat();  
  
AbstractFactory factory2 = new ConcreteFactory2();  
ProductA productA2 = factory2.createProductA();  
ProductB productB2 = factory2.createProductB();  
productA2.use();  
productB2.eat();

在抽象工厂模式中,客户端使用抽象工厂和抽象产品接口,而不需要了解具体实现的类。这种方式在需要创建产品家族的时候非常有用,因为它能够保持产品的一致性。如果系统需要增加新的产品族,只需要扩展相应的工厂类和产品类,而不需要修改已有的代码,这符合开闭原则。

标签:use,java,class,Product,模式,工厂,Override,new,public
From: https://www.cnblogs.com/quguicai/p/18015140

相关文章

  • java 抽象工厂模式
    抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,它提供了一种方式来封装一组具有共同主题的单个工厂,而不需要指定它们的具体类。在抽象工厂模式中,每个工厂都负责创建一组产品(通常是一系列产品或产品线),这些产品通常相互关联或有某种约束。在Java中实现抽象工厂模式,你通......
  • 设计模式--策略模式(Strategy Pattern)
    策略模式(StrategyPattern)是一种行为设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户端。策略模式主要包含以下几个角色:Strategy(策略):这是一个接口,通常用于定义所有支持的算法的公共接口。ConcreteStrategy(具体策略):这是实现了S......
  • 【常见java错误】arthas的使用、常用命令
    arthas的使用arthas是一款强大的Java诊断工具,可以帮助开发者快速定位和解决Java应用程序中的问题。本文将介绍arthas的基本使用方法,包括安装、启动、基本命令和高级功能。一、安装arthas1.1Windows系统在Windows系统中,可以通过以下步骤安装arthas:访问arthas的GitHub发布页......
  • JAVA并发之PriorityBlockingQueue
    PriorityBlockingQueue(优先阻塞队列)是Java并发包java.util.concurrent下面的一个工具类,它除了具有阻塞队列的功能外还具有以下特点:对队列中的元素进行排序,如果未指定比较器,插入队列的元素必须实现Comparable接口内部基于数组实现的最小二叉堆算法队列的长度是可扩展的(类似Ar......
  • 线程池工作流程 工厂流水线打比方
    线程池工作原理关于线程池的工作原理,我用下面的7幅图来展示。1.通过execute方法提交任务时,当线程池中的线程数小于corePoolSize时,新提交的任务将通过创建一个新线程来执行,即使此时线程池中存在空闲线程。2.通过execute方法提交任务时,当线程池中线程数量达到corePoolSize时,新......
  • Java基础
    java基础一、注释二、标识符和关键字关键字:标识符Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。标识符注意点:所有的标识符都应以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始首字符之后可以是字母(A-Z或者a-z),美元符($)、下划线(_)或数字的任何字符组合......
  • VMware Workstation之虚拟机NAT模式
    【摘要】三台虚拟机配置成NAT模式,实现三台虚拟机互通并可以访问互联网。一、虚拟机配置为NAT,实现访问互联网和宿主机1、虚拟网络编辑器配置VMnat8为NAT的虚拟网卡,NAT模式可以基于DHCP为三台虚拟机自动分配IP。2、虚拟机网卡通过dhcp自动获取到IP3、宿主机配置二、VMw......
  • JDK21报错 java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTre
    JDK21报错java:java.lang.NoSuchFieldError:Classcom.sun.tools.javac.tree.JCTree$JCImportdoesnothavememberfield'com.sun.tools.javac.tree.JCTreequalid'Lombok版本兼容性的问题导致Maven依赖改为新版本<dependency><groupId>org.projectlombok&l......
  • 备忘录模式
    备忘录模式-MementoPattern别名:快照模式-SnapshopPattern或令牌模式-TokenPattern是什么?是指在不破坏封装的前提下,捕获一个对象的内部状态,并且在对象之外保存这个状态,这样我们就可以在需要的时候将该对象恢复到原先保存的状态了。可以做什么?可以提供一种“后悔药”......
  • javacv模块依赖简化
    前言JavaCV更新到1.5.x版本,依赖包也迎来了很大变化,体积也变大了不少。由于javacv跨平台,那么全部javacv依赖包下载下来后,整个javacv的包会特别巨大,接近1G.显然很多平台依赖包我们并不需要,而且我们开发时只需要自己本身开发平台的依赖包就可以了JavaCV1.5.x和之前版本已经不兼容J......