设计模式:简单工厂模式(C#、JAVA、JavaScript、C++、Python、Go、PHP):

简介:

简单工厂模式,它提供了一个用于创建对象的接口,但具体创建的对象类型可以在运行时决定。这种模式通常用于创建具有共同接口的对象,并且可以根据客户端代码中的参数或配置来选择要创建的具体对象类型。
在简单工厂模式中,有一个专门的类负责创建其他类的实例,这个类称为工厂类。被创建的实例通常都具有共同的父类。工厂类中有一个用于创建对象的静态工厂方法,系统可以根据该方法所传入的参数来动态决定应该创建出哪一个产品类的实例。
以汽车生产为例,简单工厂模式可以模拟该生产过程。我们将汽车抽象为一个产品接口,不同品牌的汽车则具体实现该接口并提供各自的功能。工厂类负责根据传入的品牌参数来创建相应的汽车对象。


以下是简单工厂模式的步骤:
1、定义产品接口:首先定义一个产品接口,例如“汽车”,它包含一些公共的方法,如“启动”、“刹车”等。
2、实现具体产品类:针对不同的品牌,创建具体的实现类来实现产品接口。例如,“奔驰”和“宝马”都实现了“汽车”接口,并提供了各自特有的功能。
3、创建工厂类:创建一个工厂类,它包含一个静态工厂方法,用于根据传入的品牌参数来创建相应的汽车对象。例如,在“奔驰”工厂中,我们创建了一个静态方法“createCar”,它根据传入的品牌来实例化相应的汽车对象。
4、使用工厂类创建产品对象:客户端代码直接调用工厂类的静态工厂方法来创建需要的汽车对象,而无需关心具体的品牌和创建细节。例如,我们调用“奔驰”工厂的“createCar”方法,并传入型号参数“E-260-L”,即可得到一个奔驰E260L对象。
简单工厂模式的优点:它能将对象的创建和对象本身业务处理分离,降低系统的耦合度,使得两者修改起来都相对容易。同时,由于工厂方法是静态方法,使用起来很方便,只需通过工厂类类名直接调用即可,无需了解对象的创建细节。它可以在不修改客户端代码的情况下扩展新的产品类型,因为新产品只需实现抽象产品接口,并在工厂类中添加相应的创建逻辑即可。而不需要修改其它已经存在的代码,这样就保持了良好的封装性。
简单工厂模式的缺点:如果Shape类型的数量很多,那么ShapeFactory类就会变得很庞大,而且所有创建对象的逻辑都集中在一个类中,破坏了代码的模块化,破坏了“开闭原则”。

示例:

一、C#简单工厂模式

以下是一个示例,展示了如何在C#中实现简单工厂模式:

// 接口  
public interface Shape  
{  void Draw();  
}  // 实现接口的实体类  
public class Circle : Shape  
{  public void Draw()  {  Console.WriteLine("绘制一个圆形");  }  
}  public class Rectangle : Shape  
{  public void Draw()  {  Console.WriteLine("绘制一个矩形");  }  
}  // 工厂类,创建实体类的对象  
public class ShapeFactory  
{  // 通过GetShape方法来根据传入的字符串来返回相应的Shape类型的对象  public Shape GetShape(string type)  {  if (type == "Circle")  {  return new Circle();  }  else if (type == "Rectangle")  {  return new Rectangle();  }  else  {  throw new ArgumentException("无效的图形类型");  }  }  
}
//使用这个工厂,你可以在运行时决定创建哪种类型的 Shape。例如:
class FactoryPatternDemo
{static void Main(string[] args){ShapeFactory shapeFactory = new ShapeFactory();  Shape shape1 = shapeFactory.GetShape("Circle");  shape1.Draw();  // 输出"绘制一个圆形"  Shape shape2 = shapeFactory.GetShape("Rectangle");  shape2.Draw();  // 输出"绘制一个矩形"  }  
}

二、java简单工厂模式

以下是一个示例,展示了如何在Java中实现简单工厂模式:

// 接口  
public interface Shape {  void draw();  
}  
// 实现接口的实体类  
public class Circle implements Shape {  @Override  public void draw() {  System.out.println("绘制一个圆形");  }  
}  public class Rectangle implements Shape {  @Override  public void draw() {  System.out.println("绘制一个矩形");  }  
}
// 工厂类,创建实体类的对象 
public class ShapeFactory {  // 通过getShape方法来根据传入的字符串来返回相应的Shape类型的对象  public Shape getShape(String type) {  if (type.equalsIgnoreCase("CIRCLE")) {  return new Circle();  } else if (type.equalsIgnoreCase("RECTANGLE")) {  return new Rectangle();  } else {  throw new IllegalArgumentException("无效的形状类型");  }  }  
}
//然后我们就可以这样使用这个工厂类创建Shape对象:
public class FactoryPatternDemo {  public static void main(String[] args) {  ShapeFactory shapeFactory = new ShapeFactory();  Shape shape1 = shapeFactory.getShape("CIRCLE");  shape1.draw();  // 输出"绘制一个圆形"  Shape shape2 = shapeFactory.getShape("RECTANGLE");  shape2.draw();  // 输出"绘制一个矩形"  }  
}


三、javascript简单工厂模式

在JavaScript 中,它使用一个共同的接口来实例化不同类型的对象,而无需直接使用具体类。在工厂模式中,您可以创建一个工厂类来负责创建对象,而无需暴露创建逻辑。
以下是一个示例,展示了如何在JavaScript中实现简单工厂模式:

// Car 接口  
class Car {  constructor(name) {  this.name = name;  }  start() {  console.log(this.name + ' started');  }  stop() {  console.log(this.name + ' stopped');  }  
}  // CarFactory 工厂类  
class CarFactory {  constructor() {  this.cars = {};  }  // 创建轿车对象  createCar(name, type='Sedan') {  if (!this.cars[type]) {  this.cars[type] = new Car(type);  }  return this.cars[type];  }  // 创建卡车对象  createTruck(name, type='Pickup') {  if (!this.cars[type]) {  this.cars[type] = new Car(type);  }  return this.cars[type];  }  
}
//接下来,我们使用 CarFactory 工厂类来制造不同类型的汽车:
// 创建 CarFactory 实例  
const carFactory = new CarFactory();  // 制造轿车  
const sedan = carFactory.createCar('Alice', 'Sedan');  
sedan.start(); // 输出 "Sedan started"  
sedan.stop(); // 输出 "Sedan stopped"  // 制造卡车  
const truck = carFactory.createCar('Bob', 'Truck');  
truck.start(); // 输出 "Pickup started"  
truck.stop(); // 输出 "Pickup stopped"

四、C++简单工厂模式

在C++中,可以通过以下步骤来实现简单工厂模式:
1、定义一个抽象基类(或接口),其中包含所有派生类的公共方法。这个抽象基类可以看作是工厂的公共接口,它不知道具体对象的类型。
2、创建多个派生类,这些派生类实现了抽象基类中的所有公共方法,每个派生类具有不同的状态和行为。
3、创建一个工厂类,它包含一个用于创建对象的纯虚函数。这个纯虚函数根据传入的参数类型来创建相应的派生类对象,并返回该对象的指针。
4、在客户端代码中,通过调用工厂类的纯虚函数来创建对象。由于客户端代码不知道具体对象的类型,因此可以使用抽象基类的指针来操作这些对象。
以下是一个示例,展示了如何在C++中实现简单工厂模式:

#include <iostream>  // 抽象基类  
class Shape {  
public:  virtual void draw() = 0;  
};  // 圆形派生类  
class Circle : public Shape {  
public:  void draw() override {  std::cout << "绘制圆形" << std::endl;  }  
};  // 矩形派生类  
class Rectangle : public Shape {  
public:  void draw() override {  std::cout << "绘制矩形" << std::endl;  }  
};  // 工厂类  
class ShapeFactory {  
public:  // 根据传入的参数类型来创建相应的对象,并返回该对象的指针  static Shape* createShape(const std::string& type) {  if (type == "Circle") {  return new Circle();  } else if (type == "Rectangle") {  return new Rectangle();  } else {  throw std::invalid_argument("无效的形状类型");  }  }  
};  int main() {  // 创建圆形对象  Shape* circle = ShapeFactory::createShape("Circle");  circle->draw(); // 输出"绘制圆形"  delete circle;  // 创建矩形对象  Shape* rectangle = ShapeFactory::createShape("Rectangle");  rectangle->draw(); // 输出"绘制矩形"  delete rectangle;  return 0;  
}

五、python简单工厂模式

在Python中,工厂模式通常是通过函数或类来创建其他类的实例。简单工厂模式是一种常见的工厂模式,它通过一个单独的工厂类来创建产品对象,这个工厂类一般用来创建与环境有关的具体产品。
下面是一个Python中简单工厂模式的例子:

class Product(object):  def operation(self):  pass  class ConcreteProduct1(Product):  def operation(self):  return "ConcreteProduct1 operation"  class ConcreteProduct2(Product):  def operation(self):  return "ConcreteProduct2 operation"  class Factory:  @staticmethod  def create_product(product_type):  if product_type == "type1":  return ConcreteProduct1()  elif product_type == "type2":  return ConcreteProduct2()  else:  return None  def client_code(factory=Factory):  product = factory.create_product("type1")  print(product.operation())  if __name__ == "__main__":  client_code()

    
六、Go简单工厂模式

以下是一个示例,展示了如何在go中实现简单工厂模式:

// 抽象产品接口  
interface Product {  void use();  
}  // 具体产品类1  
class ConcreteProduct1 implements Product {  public void use() {  System.out.println("使用具体产品1");  }  
}  // 具体产品类2  
class ConcreteProduct2 implements Product {  public void use() {  System.out.println("使用具体产品2");  }  
}  // 工厂类  
class Factory {  public Product createProduct(String type) {  if (type.equals("product1")) {  return new ConcreteProduct1();  } else if (type.equals("product2")) {  return new ConcreteProduct2();  } else {  throw new IllegalArgumentException("无效的产品类型");  }  }  
}  // 客户端代码  
public class Client {  public static void main(String[] args) {  Factory factory = new Factory();  Product product1 = factory.createProduct("product1");  product1.use(); // 输出:使用具体产品1  Product product2 = factory.createProduct("product2");  product2.use(); // 输出:使用具体产品2  }  
}


七、PHP简单工厂模式

以下是一个示例,展示了如何在PHP中实现简单工厂模式:

<?php  // 产品接口  
interface Product {  public function useProduct();  
}  // 具体产品类 1  
class ConcreteProduct1 implements Product {  public function useProduct() {  echo "使用具体产品1\n";  }  
}  // 具体产品类 2  
class ConcreteProduct2 implements Product {  public function useProduct() {  echo "使用具体产品2\n";  }  
}  // 工厂类  
class Factory {  public static function createProduct($type) {  if ($type === 'product1') {  return new ConcreteProduct1();  } elseif ($type === 'product2') {  return new ConcreteProduct2();  } else {  throw new Exception('无效的产品类型');  }  }  
}  // 客户端代码  
function clientCode() {  $product1 = Factory::createProduct('product1');  $product1->useProduct(); // 输出:使用具体产品1  $product2 = Factory::createProduct('product2');  $product2->useProduct(); // 输出:使用具体产品2  
}  // 调用客户端代码  
clientCode();  
?>

《完结》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/160064.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SaaS系统用户权限设计

SaaS系统用户权限设计 学习目标&#xff1a; 理解RBAC模型的基本概念及设计思路 了解SAAS-HRM中权限控制的需求及表结构分析完成组织机构的基本CRUD操作 完成用户管理的基本CRUD操作完成角色管理的基本CRUD操作 组织机构管理 需求分析 需求分析 实现企业组织结构管理&#xff0…

期中考Web复现

第一题 1z_php <?php //Yeedo told you to study hard! echo !(!(!(!(include "flag.php")||(!error_reporting(0))||!isset($_GET[OoO])||!isset($_GET[0o0])||($_GET[OoO]2023)||!(intval($_GET[OoO][0])2023)||$_GET[0o0]$_GET[OoO]||!(md5($_GET[0o0])md5($_…

VM虚拟机运行的Ubuntu连入同一局域网,并实现双机方法

环境&#xff1a; Windows 10 VMware Workstation Pro 16 Ubuntu 20.4 在虚拟机设置桥接模式 确保虚拟机处于关闭状态&#xff0c;在Vm中设置&#xff1a; 编辑->虚拟网络编辑器 如果你以前设置过&#xff0c;可以重置之。 重置之后&#xff0c;添加桥接模式&#xff1a; …

启动速度提升 10 倍:Apache Dubbo 静态化方案深入解析

作者&#xff1a;华钟明 文章摘要&#xff1a; 本文整理自有赞中间件技术专家、Apache Dubbo PMC 华钟明的分享。本篇内容主要分为五个部分&#xff1a; -GraalVM 直面 Java 应用在云时代的挑战 -Dubbo 享受 AOT 带来的技术红利 -Dubbo Native Image 的实践和示例 -Dubbo…

用批处理连续ping一个ip段

今天写这个有一个原因&#xff0c;就是我家的网络用了一个无线电力猫做为无线网络扩展&#xff0c;但忘记了无线电力猫的IP&#xff0c;而且我家新路由器也看不到这个电力猫&#xff0c;也可能有一个原因。我原来用的是192.168.1.1的华为路由器&#xff0c;自然我就把这个无线电…

2022最新版-李宏毅机器学习深度学习课程-P17 卷积神经网络CNN

一、CNN 用于图像分类 需要图片大小统一 彩色图像分为R G B 三层&#xff0c;展平后首尾相接 值代表着颜色的强度 图像识别中不需要全连接的&#xff0c;参数太多了 观测1&#xff1a;通过判断多个小局部图像就能判断出图片标签 感受野的定义 简化1 感受野可以重叠&#xff…

接口自动化测试框架搭建【附教程加源码】

1 接口测试 接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。 接口自动化相对于UI自动化来说&#xff0c;属于更底层的测试&#xff0c;这样带来的好处就是测试收益更大&#xff…

网络安全分析——蠕虫病毒动态分析视图

蠕虫病毒&#xff08;Worm Virus&#xff09;是一种自我复制的恶意软件&#xff0c;通过网络或系统漏洞传播&#xff0c;感染其他计算机并利用其资源。与其他病毒不同&#xff0c;蠕虫病毒无需依赖于宿主文件&#xff0c;并可以自动在网络中传播&#xff0c;因此具有高度传染性…

【面试经典150 | 区间】汇总区间

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;一次遍历复杂度分析 其他语言python3C 写在最后 Tag 【一次遍历】【数组】【字符串】 题目来源 228. 汇总区间 题目解读 给定一个无重复的升序数组 nums&#xff0c;需要将这个数组按照以下规则进行汇总&#xff1…

SGPT: GPT Sentence Embeddings for Semantic Search

简介 语义搜索分为两个部分&#xff1a; 1.搜索和query 相关的topk文档。 2.理解文档和query后面隐藏的语义信息&#xff0c;而不是字面含义。 这篇论文提出了SGPT模型&#xff0c;只用decoder-only的transformer来进行语义搜索和sentence向量的提取。 1.SGPT-BE&#xff1a;来…

13-k8s-ingress网络

文章目录 一、ingress介绍二、创建nginx和tomcat供测试三、创建ingress-http四、yaml方式安装ingress五、helm方式安装ingress&#xff08;推荐&#xff09;六、Ingress的HTTPS代理 一、ingress介绍 Service对集群之外暴露服务的主要方式有两种&#xff1a;NotePort和LoadBalan…

MySQL进阶(再论JDBC)——JDBC编程思想的分析 JDBC的规范架构 JDBC相关的类分析

前言 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的标准化语言&#xff0c;它用于定义、操作和管理数据库中的数据。SQL是一种通用的语言&#xff0c;可以用于多种关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;如MySQ…

电力物联网关智能通讯管理机-安科瑞黄安南

众所周知&#xff0c;网关应用于各种行业的终端设备的数据采集与数据分析&#xff0c;然后去实现设备的监测、控制、计算&#xff0c;为系统与设备之间建立通讯联系&#xff0c;达到双向的数据通讯。 网关可以实时监测并及时发现异常数据&#xff0c;同时自身根据用户规则进行…

nginx.4——正向代理和反向代理(七层代理和四层代理)

1、正向代理反向代理 nginx当中有两种代理方式 七层代理(http协议) 四层代理(tcp/udp流量转发) 七层代理 七层代理&#xff1a;代理的是http的请求和响应。 客户端请求代理服务器&#xff0c;由代理服务器转发给客户端http请求。转发到内部服务器&#xff08;可以单台&#…

Avalonia 实现跨平台的视频聊天、屏幕分享(源码,支持Win、银河麒麟、统信UOS)

现在最火的.NET跨平台UI框架莫过于Avalonia了。Avalonia 基于.NET Core&#xff0c;因此它可以运行在任何支持.NET Core的平台上。之前基于CPF跨平台UI框架写过一个视频聊天的demo&#xff0c;而现在看来Avalonia是大势所趋&#xff0c;于是&#xff0c;我再写一个Avalonia版本…

基于区块链与联邦学习技术的数据交易平台

目录 基于区块链与联邦学习技术的数据交易平台 基于区块链与联邦学习技术的数据交易平台 联邦学习与区块链的集成的优势在于能够确认参与各方的身份并实现学习过程追溯。 首先&#xff0c;通过的身份认证系统与定制化的联邦学习协议来解决交易各方身份确认的问题。 如图1所示…

Q-learning如何与ABC等一些元启发式算法能够结合在一起?

1、出现的问题 Q-learning能和元启发式算法&#xff08;如ABC、PSO、GA、SSA等&#xff09;结合在一起&#xff0c;实现工作流调度问题&#xff1f; Q-learning和ABC (Artificial Bee Colony) 等元启发式算法可以结合在一起以解决特定类型的问题。Q-learning是一种强化学习算法…

QTday1

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->resize(430,330);this->setWindowTitle("QQ");this->setWindowIcon(QIcon("E:\\桌面\\qq.png"));this->setWindowFlag(Qt::FramelessWindowHint…

Windows工业三防平板全功能NFC近距离感应一维/二维扫描

Windows系统工业三防平板电脑是一种在智慧工厂仓储物流、MES数采、车载设备、设备检测、自动化控制等领域广泛应用的先进设备。此外&#xff0c;它还在公共服务领域&#xff0c;如高速交通、物流运输、电力检测、公务执法、银行金融、船舶装备、户外勘测、建筑工程、汽车检测、…

【python高级】设计模式、类工厂、对象工厂

一、说明 最近试着读Design pattern&#xff0c; 不过有些概念实在太抽象了&#xff0c; 整理一下自己所学抽象工厂的精神&#xff0c;就是要有abstract class&#xff08;not implement&#xff09;&#xff0c;而所有不同种类的对象&#xff0c;都是继承这个abstract class&a…