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);估计这就是简单工厂模式又叫做静态工厂模型的原因吧。

  • 相关阅读:
    JavaScript深拷贝和浅拷贝
    JavaScript正则表达式(一)-常用方法
    面向对象之继承-5种JavaScript继承的方法
    java学习笔记之System类
    MySQL的grant,revoke使用
    LoadRunner+Android模所器录制脚本
    Mysql
    mosquitto_pub和mosquitto_sub 命令参数说明
    【转载】原 IntelliJ IDEA (idea)引入eclipse web项目
    eclipse恢复默认布局
  • 原文地址:https://www.cnblogs.com/bewolf/p/4217839.html
Copyright © 2011-2022 走看看