zoukankan      html  css  js  c++  java
  • 简单工厂模式

    一、简单工厂模式的相关概念:
    1、定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。
    其核心思想就是有一个专门的工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
    2、举例:如卖水果,每种水果有不一样的价钱,那么就可以将水果作为抽象产品,而苹果,香蕉等作为具体产品
    3、UML图如下:
    每个类的主要功能:
    简单工厂:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
    抽象产品:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
    具体产品:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
    二、C++程序示例
     
      1 // 简单工厂模式.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include <iostream>
      6 #include<string>
      7 using namespace std;
      8 
      9 //抽象产品
     10 class fruit
     11 {
     12 public:
     13     fruit();
     14     virtual ~fruit();
     15     //由于此类是抽象类,没有价格,所以只能将价格显示定义为纯虚函数
     16     virtual void show_price()=0;
     17 };
     18 fruit::fruit()
     19 {}
     20 fruit::~fruit()
     21 {}
     22 
     23 //具体产品1
     24 class apple :public fruit
     25 {
     26 public :
     27     apple();
     28     virtual ~apple();
     29     virtual void show_price();
     30 };
     31 apple::apple()
     32 {
     33     cout<<"i am an apple"<<endl;
     34 }
     35 apple::~apple()
     36 {}
     37 void apple::show_price()
     38 {
     39     cout<<"my price is 5"<<endl;
     40 }
     41 
     42 //具体产品2
     43 class orange :public fruit
     44 {
     45 public :
     46     orange();
     47     virtual ~orange();
     48     virtual void show_price();
     49 };
     50 orange::orange()
     51 {
     52     cout<<"i am an orange"<<endl;
     53 }
     54 orange::~orange()
     55 {}
     56 void orange::show_price()
     57 {
     58     cout<<"my price is 6"<<endl;
     59 }
     60 //简单工厂
     61 //输入要创建实例的编号,创建对应实例,1:apple,2:orange
     62 class fruit_samplefactory
     63 {
     64 public:
     65     fruit_samplefactory();
     66     ~fruit_samplefactory();
     67 public:
     68     //此处一定要声明为静态成员函数,因为非静态成员,必须首先实例化一个类对象,才能使用
     69     static fruit* creat_fruit(int name_num);
     70     //fruit* creat_fruit(int name_num);
     71 };
     72 fruit_samplefactory::fruit_samplefactory()
     73 {
     74 
     75 }
     76 fruit_samplefactory::~fruit_samplefactory()
     77 {
     78 
     79 }
     80 fruit* fruit_samplefactory::creat_fruit(int name_num)
     81 {
     82     switch(name_num)
     83     {
     84     case 1:
     85             return new apple;
     86             break;
     87     case 2:
     88             return new orange;
     89             break;
     90     default:
     91         cout<<"您输入的类型不存在"<<endl;
     92         return NULL;
     93         break;
     94     }
     95 }
     96 
     97 //用户界面
     98 int _tmain(int argc, _TCHAR* argv[])
     99 {
    100     int num=2;
    101     fruit* orange=NULL;
    102     orange=fruit_samplefactory::creat_fruit(num);
    103     orange->show_price();
    104     delete orange;
    105     orange=NULL;
    106     return 0;
    107 }

    注意问题:1、第16行show_price(),由于fruit是抽象产品,没有价格,所以此处一定要用纯虚函数
                       虚函数是一定要在类中声明并定义的,而纯虚函数可以在类中声明而不定义,而在子类中进行定义

                  2、由于第102行调用creat_fruit(num);的时候并没有将orange实例化为fruit_samplefactory类,而因为非静态成员,必须首先实例化一个类对象,才能使用。

                       所以要将69行中creat_fruit(num);声明为静态成员函数static fruit* creat_fruit(int name_num);估计这就是简单工厂模式又叫做静态工厂模型的原因吧。

  • 相关阅读:
    arcgis api 3.x for js 入门开发系列八聚合效果(附源码下载)
    arcgis api 3.x for js 入门开发系列七图层控制(附源码下载)
    arcgis api 3.x for js 入门开发系列六地图分屏对比(附源码下载)
    arcgis api 3.x for js 入门开发系列五地图态势标绘(附源码下载)
    arcgis api 3.x for js 入门开发系列四地图查询(附源码下载)
    Java里面获取当前服务器的IP地址
    Flutter at Google I/O 2018
    Modbus RTU 协议使用汇总
    plsql 创建表空间、用户、赋予权限
    Oracle:ODP.NET Managed 小试牛刀
  • 原文地址:https://www.cnblogs.com/bewolf/p/4217839.html
Copyright © 2011-2022 走看看