两种语言实现设计模式(C++和Java)(一:工厂模式)

本篇开始记录实现设计模式在工作中的两种常见语言上的实现。

本篇介绍最简单的工厂模式。

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

使用情景: 

  在不确定会有多少个处理操作时应该考虑使用简单工厂模式,如针对同样的接收到的数据,处理的逻辑可能会不同,可能以后还会增加新的操作。 

案例: 

如果实现计算器的功能时,对于同样的输入数据,可能执行加、减、乘、除,甚至其他的功能。因此可以抽象出一个操作的抽象类或是接口,提供一个统一的处理方法(此处为process),然后每种操作创建出一个子类出来。而判断具体使用哪个具体的实现类是在工厂类中进行判断的(将存放操作的变量传递给工厂的生产方法)。工厂类始终返回的是这个抽象类,这样如果对原有功能进行更改或是新添加新的功能,也不会对原来的其他类做修改,只编译修改的那个类或是新的类就可以了。

这样就做到了把耦合降到最低,同时也便于维护。

简单工厂:针对同样的数据,不同的操作用同一个接口

工厂方法:针对同样的数据,不同的操作用不同的接口

抽象工厂:针对不同的数据,不同的操作用不同的接口

简单工厂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 }

简单工厂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 }

猜你喜欢

转载自www.cnblogs.com/Asp1rant/p/10738397.html