设计模式-简单工厂和工厂方法

简介: 设计模式-简单工厂和工厂方法

简单工厂 Simple Factory

把对象的创建封装在一个接口函数里面,通过传入不同的标识,返回创建的对象,客户不用自己负责new对象,不用了解对象创建的详细过程

提供创建对象实例的接口函数不闭合,不能对修改关闭

工厂方法 Factory Method

Factory基类,提供了一个纯虚函数(创建产品),定义派生类(具体产品的工厂)负责创建对应的产品,可以做到不同的产品,在不同的工厂里面创建,能够对现有工厂,以及产品的修改关闭

实际上,很多产品是有关联关系的,属于一个产品簇,不应该放在不同的工厂里面去创建,这样一是不符合实际的产品对象创建逻辑,二是工厂类太多了,不好维护

抽象工厂 Abstract Factory

把有关联关系的,属于一个产品簇的所有产品创建的接口函数,放在一个抽象工厂里面AbstractFactory,派生类(具体产品的工厂)应该负责创建该产品簇里面所有的产品

工厂模式:主要是封装了对象的创建

简单工厂:

class Car
{
public:
  Car(string name) : _name(name) {}
  virtual void show() = 0;
protected:
  string _name;
};
class BMW : public Car
{
public:
  BMW(string name) : Car(name) {}
  void show()
  {
    cout << "获取了一辆宝马汽车:" << _name << endl;
  }
};
class Audi : public Car
{
public:
  Audi(string name) : Car(name) {}
  void show()
  {
    cout << "获取了一辆奥迪汽车:" << _name << endl;
  }
};
enum CarType
{
  eBMW,eAUDI
};
class SimpleFactory
{
public:
  Car *createCar(CarType ct)
  {
    switch (ct)
    {
    case eBMW:
      return new BMW("X1");
    case eAUDI:
      return new Audi("A6");
    default:
      cerr << "传入工厂的参数不正确:" << ct << endl;
      break;
    }
    return nullptr;
  }
};
int main()
{
  //Car *p1 = new BMW("X1");
  //Car *p2 = new Audi("A6");
  unique_ptr<SimpleFactory> factory(new SimpleFactory());
  unique_ptr<Car> p1(factory->createCar(eBMW));
  unique_ptr<Car> p2(factory->createCar(eAUDI));
  p1->show();
  p2->show();
  return 0;
}

工厂方法:

class Car
{
public:
  Car(string name) : _name(name) {}
  virtual void show() = 0;
protected:
  string _name;
};
class BMW : public Car
{
public:
  BMW(string name) : Car(name) {}
  void show()
  {
    cout << "获取了一辆宝马汽车:" << _name << endl;
  }
};
class Audi : public Car
{
public:
  Audi(string name) : Car(name) {}
  void show()
  {
    cout << "获取了一辆奥迪汽车:" << _name << endl;
  }
};
//符合开闭原则
class Factory
{
public:
  virtual Car *createCar(string name) = 0;//工厂方法
};
class BMWFactory : public Factory
{
public:
  Car* createCar(string name)
  {
    return new BMW(name);
  }
};
class AudiFactory : public Factory
{
public:
  Car* createCar(string name)
  {
    return new Audi(name);
  }
};
int main()
{
  unique_ptr<Factory> bmwfty(new BMWFactory());
  unique_ptr<Factory> audifty(new AudiFactory());
  unique_ptr<Car> p1(bmwfty->createCar("X6"));
  unique_ptr<Car> p2(audifty->createCar("A8"));
  p1->show();
  p2->show();
  return 0;
}
相关文章
|
1月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
3月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
3月前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
|
4月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
4月前
|
设计模式 XML Java
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
文章详细介绍了简单工厂模式(Simple Factory Pattern),这是一种创建型设计模式,用于根据输入参数的不同返回不同类的实例,而客户端不需要知道具体类名。文章通过图表类的实例,展示了简单工厂模式的结构、时序图、代码实现、优缺点以及适用环境,并提供了Java代码示例和扩展应用,如通过配置文件读取参数来实现对象的创建。
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
|
4月前
|
设计模式 uml
设计模式-------------工厂模式之工厂方法模式(创建型)
工厂方法模式是一种创建型设计模式,它通过定义一个用于创建对象的接口,让子类决定实例化哪一个类,从而实现类的实例化推迟到子类中进行,提高了系统的灵活性和可扩展性。
|
4月前
|
设计模式 uml C语言
设计模式----------工厂模式之简单工厂模式(创建型)
这篇文章详细介绍了简单工厂模式,包括其定义、应用场景、UML类图、通用代码实现、运行结果、实际应用例子,以及如何通过反射机制实现对象创建,从而提高代码的扩展性和维护性。
设计模式----------工厂模式之简单工厂模式(创建型)
|
4月前
|
设计模式 测试技术 Go
[设计模式]创建型模式-简单工厂模式
[设计模式]创建型模式-简单工厂模式
|
6月前
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
|
6月前
|
设计模式 搜索推荐
工厂方法模式-大话设计模式
工厂方法模式-大话设计模式