两种语言实现设计模式(C++和Java)(一:工厂模式)
本篇开始记录实现设计模式在工作中的两种常见语言上的实现。
本篇介绍最简单的工厂模式。
工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。
使用情景:
在不确定会有多少个处理操作时应该考虑使用简单工厂模式,如针对同样的接收到的数据,处理的逻辑可能会不同,可能以后还会增加新的操作。
案例:
如果实现计算器的功能时,对于同样的输入数据,可能执行加、减、乘、除,甚至其他的功能。因此可以抽象出一个操作的抽象类或是接口,提供一个统一的处理方法(此处为process),然后每种操作创建出一个子类出来。而判断具体使用哪个具体的实现类是在工厂类中进行判断的(将存放操作的变量传递给工厂的生产方法)。工厂类始终返回的是这个抽象类,这样如果对原有功能进行更改或是新添加新的功能,也不会对原来的其他类做修改,只编译修改的那个类或是新的类就可以了。
这样就做到了把耦合降到最低,同时也便于维护。
简单工厂:针对同样的数据,不同的操作用同一个接口
工厂方法:针对同样的数据,不同的操作用不同的接口
抽象工厂:针对不同的数据,不同的操作用不同的接口
一:简单工厂模式
1.简单工厂C++中的实现:
1 #include <iostream> 2 3 using namespace std; 4 5 class ICarFactory{ 6 public: 7 ICarFactory(){} 8 virtual ~ICarFactory(){} 9 virtual void produceCar() = 0; 10 }; 11 12 class CarFactoryBenz:public ICarFactory{ 13 public: 14 void produceCar(){ 15 cout<<"Produce a car of Benz"<<endl; 16 } 17 }; 18 19 class CarFactoryVolkswagen: public ICarFactory{ 20 public: 21 void produceCar(){ 22 cout<<"Produce a car of Volkswagen"<<endl; 23 } 24 }; 25 26 int main() 27 { 28 ICarFactory *car1 = new CarFactoryBenz(); 29 ICarFactory *car2 = new CarFactoryVolkswagen(); 30 car1->produceCar(); 31 car2->produceCar(); 32 return 0; 33 }
2.简单工厂Java中的实现:
1 public interface ICarFactory { 2 public void produceCar(); 3 } 4 5 public class FactoryBenz implements ICarFactory{ 6 7 public void produceCar() { 8 System.out.println("Produce a car of Benz"); 9 } 10 } 11 12 public class FactoryToyota implements ICarFactory{ 13 public void produceCar() { 14 System.out.println("Produce a car of Toyota"); 15 } 16 } 17 18 public class Main { 19 20 public static void main(String[] args){ 21 FactoryBenz factoryBenz = new FactoryBenz(); 22 FactoryToyota factoryToyota = new FactoryToyota(); 23 factoryBenz.produceCar(); 24 factoryToyota.produceCar(); 25 } 26 27 }
二:工厂方法模式
1.工厂方法模式在C++中的实现
核心思想:将工厂抽象出来,将产品抽象出来,子工厂负责new 子产品指针,返回抽象产品类指针,外面调用时只需要生成基类工厂指针,调用创建产品函数,就可以对该产品进行具体的操作,优点是能够将添加产品完全独立出来不再修改内部代码。
与简单工厂比较:修正了简单工厂模式中不遵循开放---封闭原则,例如添加新产品时仍需要修改工厂基类内容,工厂方法模式将判断移动到客户端实现。
1 #include <iostream> 2 3 using namespace std; 4 5 class ICar{ 6 public: 7 ICar(void){} 8 ~ICar(void){} 9 virtual void printInfo() = 0; 10 }; 11 12 class CarBenz:public ICar{ 13 public: 14 CarBenz(){} 15 ~CarBenz(){} 16 void printInfo(){ 17 cout<<"The brand is Benz"<<endl; 18 } 19 }; 20 21 class CarToyota:public ICar{ 22 public: 23 CarToyota(){} 24 ~CarToyota(){} 25 void printInfo(){ 26 cout<<"The brand is Toyota"<<endl; 27 } 28 }; 29 30 class IFactory{ 31 public: 32 IFactory(void){} 33 ~IFactory(void){} 34 virtual ICar* produceCar() = 0; 35 }; 36 37 class FactoryBenz:public IFactory{ 38 public: 39 FactoryBenz(){} 40 ~FactoryBenz(){} 41 ICar* produceCar(){ 42 cout<<"Produce a car of Benz"<<endl; 43 ICar* car = new CarBenz(); 44 return car; 45 } 46 }; 47 48 class FactoryToyota:public IFactory{ 49 public: 50 FactoryToyota(){} 51 ~FactoryToyota(){} 52 ICar* produceCar(){ 53 cout<<"Produce a car of Toyota"<<endl; 54 ICar* car = new CarToyota(); 55 return car; 56 } 57 }; 58 59 int main() 60 { 61 IFactory* factory = new FactoryBenz(); 62 ICar* car = factory->produceCar(); 63 car->printInfo(); 64 IFactory* factory2 = new FactoryToyota(); 65 ICar* car2 = factory2 ->produceCar(); 66 car2->printInfo(); 67 return 0; 68 }
输出:
Produce a car of Benz
The brand is Benz
Produce a car of Toyota
The brand is Toyota
2.工厂方法模式在Java中的实现
1 public interface ICar { 2 void printInfo(); 3 } 4 5 public class CarBenz implements ICar { 6 7 public void printInfo(){ 8 System.out.println("The brand is Benz"); 9 } 10 } 11 12 public class CarToyota implements ICar{ 13 14 public void printInfo(){ 15 System.out.println("The brand is toyota"); 16 } 17 18 } 19 20 public interface ICarFactory { 21 ICar produceCar(); 22 } 23 24 public class FactoryBenz implements ICarFactory{ 25 26 public ICar produceCar(){ 27 System.out.println("Produce a Benz car"); 28 return new CarBenz(); 29 } 30 } 31 32 public class FactoryToyota implements ICarFactory{ 33 34 public ICar produceCar(){ 35 System.out.println("Produce a Toyota car"); 36 return new CarToyota(); 37 } 38 39 } 40 41 public class Main { 42 43 public static void main(String[] args){ 44 ICarFactory factoryBenz = new FactoryBenz(); 45 ICarFactory factoryToyota = new FactoryToyota(); 46 47 ICar benz = factoryBenz.produceCar(); 48 ICar toyota = factoryToyota.produceCar(); 49 50 benz.printInfo(); 51 toyota.printInfo(); 52 53 } 54 }
输出:
Produce a Benz car
Produce a Toyota car
The brand is Benz
The brand is toyota
三:抽象工厂模式
1.C++实现抽象工厂
1 #include <iostream> 2 3 using namespace std; 4 5 class ICarToyota{ 6 public: 7 ICarToyota(){} 8 ~ICarToyota(){} 9 virtual void printInfo() = 0; 10 }; 11 12 class CarToyotaChr:public ICarToyota{ 13 public: 14 CarToyotaChr(){} 15 ~CarToyotaChr(){} 16 void printInfo(){ 17 cout<< "The car is Toyota C-HR"<<endl; 18 } 19 }; 20 21 class CarToyotaCarolla:public ICarToyota{ 22 public: 23 CarToyotaCarolla(){} 24 ~CarToyotaCarolla(){} 25 void printInfo(){ 26 cout<< "The car is Toyota Carolla"<<endl; 27 } 28 }; 29 30 class ICarAudi{ 31 public: 32 ICarAudi(){} 33 ~ICarAudi(){} 34 virtual void printInfo()=0; 35 }; 36 37 class CarAudiA3:public ICarAudi{ 38 public: 39 CarAudiA3(){} 40 ~CarAudiA3(){} 41 void printInfo(){ 42 cout<< "The car is audi a3"<<endl; 43 } 44 }; 45 46 class CarAudiQ5:public ICarAudi{ 47 public: 48 CarAudiQ5(){} 49 ~CarAudiQ5(){} 50 void printInfo(){ 51 cout<< "The car is audi q5"<<endl; 52 } 53 }; 54 55 class IFactory{ 56 public: 57 IFactory(){} 58 ~IFactory(){} 59 virtual ICarToyota* produceCarToyota()=0; 60 virtual ICarAudi* produceCarAudi()=0; 61 }; 62 63 class FactoryCompact:public IFactory{ 64 public: 65 FactoryCompact(){} 66 ~FactoryCompact(){} 67 ICarAudi* produceCarAudi(){ 68 cout<<"Produce a audi compact car"<<endl; 69 return new CarAudiA3; 70 } 71 ICarToyota* produceCarToyota(){ 72 cout<<"Produce a toyota compact car"<<endl; 73 return new CarToyotaCarolla; 74 } 75 }; 76 77 class FactorySuv:public IFactory{ 78 public: 79 FactorySuv(){} 80 ~FactorySuv(){} 81 ICarAudi* produceCarAudi(){ 82 cout<<"Produce a audi suv"<<endl; 83 return new CarAudiQ5; 84 } 85 ICarToyota* produceCarToyota(){ 86 cout<<"Produce a toyota suv"<<endl; 87 return new CarToyotaChr; 88 } 89 }; 90 91 int main() 92 { 93 FactoryCompact factory1; 94 FactorySuv factory2; 95 ICarAudi* audi1; 96 ICarAudi* audi2; 97 ICarToyota* toyota1; 98 ICarToyota* toyota2; 99 audi1 = factory1.produceCarAudi(); 100 audi1->printInfo(); 101 audi2 = factory2.produceCarAudi(); 102 audi2->printInfo(); 103 toyota1 = factory1.produceCarToyota(); 104 toyota1->printInfo(); 105 toyota2 = factory2.produceCarToyota(); 106 toyota2->printInfo(); 107 }
输出:
Produce a audi compact car
The car is audi a3
Produce a audi suv
The car is audi q5
Produce a toyota compact car
The car is Toyota Carolla
Produce a toyota suv
The car is Toyota C-HR
2.Java实现抽象工厂
1 public interface ICarAudi { 2 void printInfo(); 3 } 4 5 public class CarAudiA3 implements ICarAudi { 6 public void printInfo() { 7 System.out.println("The car is Audi A3"); 8 } 9 } 10 11 public class CarAudiQ5 implements ICarAudi { 12 public void printInfo() { 13 System.out.println("The car is Audi Q5"); 14 } 15 } 16 17 public interface ICarToyota { 18 void printInfo(); 19 } 20 21 public class CarToyotaCarolla implements ICarToyota { 22 public void printInfo() { 23 System.out.println("The car is Toyota Carolla"); 24 } 25 } 26 27 public class CarToyotaChr implements ICarToyota { 28 public void printInfo() { 29 System.out.println("The vehicle is toyota C-HR"); 30 } 31 } 32 33 public interface IFactory { 34 ICarAudi produceAudi(); 35 ICarToyota produceToyota(); 36 } 37 38 public class FactoryCompact implements IFactory { 39 public ICarAudi produceAudi() { 40 System.out.println("Produce an audi compact"); 41 return new CarAudiA3(); 42 } 43 44 public ICarToyota produceToyota() { 45 System.out.println("Produce a toyota compact"); 46 return new CarToyotaCarolla(); 47 } 48 } 49 50 public class FactoryCompact implements IFactory { 51 public ICarAudi produceAudi() { 52 System.out.println("Produce an audi compact"); 53 return new CarAudiA3(); 54 } 55 56 public ICarToyota produceToyota() { 57 System.out.println("Produce a toyota compact"); 58 return new CarToyotaCarolla(); 59 } 60 } 61 62 63 public class Main { 64 65 public static void main(String[] args){ 66 FactoryCompact factoryCompact = new FactoryCompact(); 67 FactorySuv factorySuv = new FactorySuv(); 68 ICarAudi c1 = factoryCompact.produceAudi(); 69 c1.printInfo(); 70 ICarAudi c2 = factorySuv.produceAudi(); 71 c2.printInfo(); 72 ICarToyota c3 = factoryCompact.produceToyota(); 73 c3.printInfo(); 74 ICarToyota c4 = factorySuv.produceToyota(); 75 c4.printInfo(); 76 } 77 78 }
输出:
Produce an audi compact
The car is Audi A3
Produce an audi suv
The car is Audi Q5
Produce a toyota compact
The car is Toyota Carolla
Produce an Toyota suv
The vehicle is toyota C-HR
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具