首页 > 其他分享 >简单工厂模式

简单工厂模式

时间:2024-07-29 10:01:10浏览次数:8  
标签:Product 对象 创建 披萨 模式 工厂 产品 简单

1、背景

我开一家披萨店,当客户需要某种披萨并且我这家店里也能做的时候,我就会为其提供所需要的披萨。这时候,我这家披萨店就可以看做工厂(Factory),而生产出来的披萨被成为产品(Product),披萨的名称则被称为参数,工厂可以根据参数的不同返回不同的产品,这就是简单工厂模式。

工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。

2、定义

ProductA、ProductB和ProductC继承自Product虚拟类,Show方法是不同产品的自描述;Factory依赖于ProductA、ProductB和ProductC,Factory根据不同的条件创建不同的Product对象。

1、定义:

定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method)

2、组成环节:

1、Factory(工厂):核心部分,负责实现创建所有产品的内部逻辑,工厂类可以被外界直接调用,创建所需对象

工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了

2、Product(抽象类产品):工厂类所创建的所有对象的父类,封装了产品对象的公共方法,所有的具体产品为其子类对象

3、ProductA、ProductB…(具体产品):简单工厂模式的创建目标,所有被创建的对象都是某个具体类的实例。它要实现抽象产品中声明的抽象方法

3、特征

1、简单工厂模式的核心思想就是:有一个专门的类(工厂类)来负责创建实例的过程。

把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。

2、如果简单工厂模式所涉及到的具体产品之间没有共同的逻辑,那么我们就可以使用接口来扮演抽象产品的角色;

由于对象的创建过程是我们不需要去关心的,而我们注重的是对象的实际操作,所以,我们需要分离对象的创建和操作两部分,如此,方便后期的程序扩展和维护。

3、如果具体产品之间有功能的逻辑或,我们就必须把这些共同的东西提取出来,放在一个抽象类中,然后让具体产品继承抽象类。

4.在程序中,需要创建的对象很多,导致对象的new操作多且杂时,需要使用简单工厂模式;

缺点:

5、工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类

6、当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延

场景:

1、工厂类负责创建的对象比较少;

2、客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;

4、代码演示

package com.factory;
​
/**
 * TODO
 *
 * @author jiucimu
 * @since 2024/5/21
 *
 * 简单工厂设计模式
 */
public class SimpleFactory {
    public static Product createProduct(String type){
        if(type.equals("A")){
            return new ProductA();
        } else
            return new ProductB();
    }
​
    public static void main(String[] args) {
        Product product = SimpleFactory.createProduct("B");
        product.print();
    }
}
​
//抽象父类产品
abstract class Product{
    public abstract void print();
}
​
class ProductA extends Product{
​
    @Override
    public void print() {
        System.out.println("我是产品A");
    }
}
​
class ProductB extends Product{
​
    @Override
    public void print() {
        System.out.println("我是产品B");
    }
}

标签:Product,对象,创建,披萨,模式,工厂,产品,简单
From: https://blog.csdn.net/qq_65628371/article/details/140718799

相关文章

  • 常见的LVS模式区别
    几种常见的LVS(LinuxVirtualServer)模式:NAT模式、IP地址转发(DirectRouting)模式和IP隧道(Tunneling)模式的区别:1.NAT模式特点:LVS作为前端代理,接收客户端的请求,并修改数据包的目标地址和端口,然后将请求转发给后端的真实服务器。后端服务器返回的响应经过LVS再修改为源地......
  • 简单工厂模式详解
    一,概述        简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。        简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。      ......
  • 单例模式
    目录什么是单例模式?单例模式的特点单例模式的实现方式懒汉模式实现一(非线程安全)实现二(线程安全)实现三(线程安全、推荐)饿汉模式总结什么是单例模式?单例模式属于简单设计模式的一种。在整个系统的生命周期内,单例类有且只有唯一一个对象,典型的应用比如日志的句柄。使用单例模......
  • 攻防世界-简单的图片
    攻防世界-简单的图片1首先拿到图片是一张非常朴实的图片用010打开发现没什么特别之处因为是png图片猜测是lsb隐写,这里一开始我用的zsteg发现提取不全用Stegsolve打开看看,尝试了半天发现什么特殊信息,最后发现位平面顺序即bitplaneorder这一选项要选择BGR,得到下图发现有......
  • 设计模式实战:日志系统的设计与实现
    问题描述设计一个日志系统,支持在应用程序中记录日志信息。系统需要确保日志记录器是唯一的实例,支持不同的日志记录方法(如文件、数据库),并且能够适配不同的日志格式(如JSON、XML)。设计分析单例模式单例模式确保一个类只有一个实例,并提供一个全局访问点。日志系统中的日志记......
  • 简单题 加强版
    由简单版中,我们已经推出了\[\sum_{d=1}^n\mu^2(d)d^{k+1}\sum_{t=1}^{\lfloor{\frac{n}{d}}\rfloor}\mu(t)t^k\sum_{i=1}^{\lfloor{\frac{n}{dt}}\rfloor}\sum_{j=1}^{\lfloor{\frac{n}{dt}}\rfloor}(i+j)^k\]我们设\(T=td\),则设\(S(x)=\sum_{i=1}^x\sum_{j=1......
  • 浅谈简单的数据结构1(树状数组 、线段树)(c++)
    *_*课间休息后的知识点轰炸树状数组引入给定长为n的序列a,q次操作,每次查询一段区间的和,或修改一个数的权值。1≤n,q≤5×10^5,0≤a_i≤10^9。分析如果没有修改操作,这是一道非常简单的前缀和题。假如我们修改前缀和数组,查询就还是O(1)的,是否可行呢?当然不行。考虑......
  • OAuth2 + Gateway统一认证一步步实现(公司项目能直接使用),密码模式&授权码模式
    文章目录认证的具体实现环境的搭建基础版授权服务搭建引入依赖创建数据表yml配置配置SpringSecurity定义认证授权的配置类授权服务器存储客户端信息修改授权服务配置,支持密码模式基础版授权服务测试授权码模式测试密码模式测试**测试校验token接口**整合JWT使用jwt基......
  • 设计模式:代理、装饰和适配器模式的区别
    结构对比讲实话,博主当初学习完整设计模式时,这三种设计模式单独摘哪一种都是十分清晰和明确的,但是随着模式种类的增加,在实际使用的时候竟然会出现恍惚,例如读开源代码时,遇到不以模式命名规范的代码时,一时难以说清具体是使用的这三种里的哪一种。之所以会出现混淆的原因是,三种模式......
  • springsecurity通过策略模式设置统一认证接口
     还是回到这张图:我们想不止使用数据库查找的方法去实现认证,而是使用一个统一的认证方法,首先需要修改DaoAuthenticationProvider内实现功能7的方法protectedvoidadditionalAuthenticationChecks(UserDetailsuserDetails,UsernamePasswordAuthenticationTokenauthenticatio......