Factory pattern(工厂方法模式)

工厂模式概念:

  • 实例化对象,用工厂方法代替new操作
  • 工厂模式包括工厂方法模式和抽象工厂模式
  • 抽象工厂模式是工厂方法模式的扩展

两种工厂模式具体定义:

  • 简单工厂(简单工厂不是设计模式而是编程习惯,有些人误以为是“工厂模式”):将共性的算法抽取,进行抽象定义在一个类作为工厂类,工厂类根据参数化方法来实例化对象
  • 工厂方法模式(Factory Mode):定义一个用于创建对象的接口,让子类来决定实例化的类是哪一个。工厂方法将类实例化延迟到子类
  • 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,无需指定具体类

工厂方法模式

工厂方法模式特点

  • 特点: 创建与使用解耦
  • 关键代码:创建过程在子类执行
  • 使用场景:不同条件下创建不同实例时

1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。

工厂方法模式类图

  • 抽象工厂(Factory):提供创建产品的接口,调用者通过它访问具体工厂的工厂方法factoryMethod()来创建指定产品。
  • 具体工厂(ConcreteFactory):实现抽象工厂的抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义产品的规范,描述产品的主要特性和功能。
  • 具体产品(ConcreteProduct):实现抽象产品角色所定义的接口,由具体工厂来创建,与具体工厂一一对应。

简单工厂和工厂方法之间的差异: 简单工厂将全部的事情放在一个地方处理完;工厂方法创建一个框架,让子类决定要如何实现(将对象实例化延迟到子类), 简单工厂不具备工厂方法的弹性无法变更正在创建的产品

实例01:汽车工厂(简单工厂模式)

类图

实例代码

// 产品类
abstract class Car{
public String name;
public String color;
Car(String _name, String _color){
this.name = _name;
this.color = _color;
}
abstract void getInfo();
}
class BenzCar extends Car{
public BenzCar(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车品牌:" + this.name + " ,汽车颜色: " + this.color);
}
}
class BMWCar extends Car{
public BMWCar(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车品牌:" + this.name + " ,汽车颜色: " + this.color);
}
}
// 简单工厂类
class SimpleCarFactory{
/**
* carName: 车名称
* color: 车的颜色
* type: 汽车品牌
*/
@Override
public Car getCar(String carName, String color, String type) { // 参数化工厂方法: 根据传入的参数创建不同的对象
if("Benz".equals(type)){
return new BenzCar(carName, color);
}else if ("BMW".equals(type)){
return new BMWCar(carName, color);
}else{
System.out.println("No matching type!");
return null;
}
}
}
public class FactoryPatterDemoSpace {
public static void main(String[] args) {
SimpleCarFactory carFactory = new SimpleCarFactory();
Car car = carFactory.getCar("奔驰", "黑色", "Benz");
car.getInfo(); // 汽车品牌:奔驰 ,汽车颜色: 黑色
}
}

实例02:汽车工厂(工厂方法模式)

类图

实例代码

// 产品类
abstract class Car{
public String name; // 汽车名称
public String color; // 汽车颜色
Car(String _name, String _color){
this.name = _name;
this.color = _color;
}
abstract void getInfo();
}
// 产品具体类
class BenzCarInGermany extends Car{
public BenzCarInGermany(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车名称:" + this.name
+ " ,汽车颜色: " + this.color
+ " ,汽车配置来源:德国🇩🇪-Germany");
}
}
// 产品具体类
class BenzCarInChina extends Car{
public BenzCarInChina(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车名称:" + this.name
+ " ,汽车颜色: " + this.color
+ " ,汽车配置来源:中国🇨🇳-China");
}
}
// 产品具体类
class BMWCarInGermany extends Car{
public BMWCarInGermany(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车名称:" + this.name
+ " ,汽车颜色: " + this.color
+ " , 汽车配置来源:德国🇩🇪-Germany" );
}
}
// 产品具体类
class BMWCarInChina extends Car{
public BMWCarInChina(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车名称:" + this.name
+ " ,汽车颜色: " + this.color
+ " , 汽车配置来源:中国🇨🇳-China" );
}
}
// 工厂类
interface CarFactory{
Car createCar(String carName, String color, String place);
}
// 工厂子类用来决定实例化对象的类具体是哪一个(工厂方法模式将类实例化延迟到子类)
class BenzCarFactory implements CarFactory{
/**
* @param carName 汽车名称
* @param color 汽车颜色
* @param place 汽车配置来源地
* */
@Override
public Car createCar(String carName, String color, String place) {
if("Germany".equals(place)){
return new BenzCarInGermany(carName, color);
}else if("China".equals(place)){
return new BenzCarInChina(carName, color);
}else{
System.out.println("暂无!");
return null;
}
}
}
public class FactoryPatterDemoSpace {
public static void main(String[] args) {
CarFactory carFactory = new BenzCarFactory();
Car car01 = carFactory.createCar("奔驰233", "黑色", "China");
car01.getInfo(); // 汽车名称:奔驰233 ,汽车颜色: 黑色 ,汽车配置来源:中国🇨🇳-China
Car car02 = carFactory.createCar("奔驰666", "蓝色", "Germany");
car02.getInfo(); // 汽车名称:奔驰666 ,汽车颜色: 蓝色 ,汽车配置来源:德国🇩🇪-Germany
}
}

参考:https://www.runoob.com/design-pattern/factory-pattern.html

posted @   Felix_Openmind  阅读(597)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
*{cursor: url(https://files-cdn.cnblogs.com/files/morango/fish-cursor.ico),auto;}
点击右上角即可分享
微信分享提示