• 【设计模式】工厂方法


    工厂方法,跟抽象工厂、建造者模式等解决的问题都类似,通过将产品和其实现分离,达到了客户和具体产品之间的解耦。

    工厂方法,其精髓就是他名字本身,在工厂类中提供一个工厂方法,该方法返回具体的产品。客户只需要关注该产品的接口(一般是抽象父类),而无需关注起具体实现和创建过程。

    工厂方法的一个缺点是客户可能仅仅为了穿件一个具体的产品,需要增加creator的一个子类。一般通过c++的模板方法可以解决这个问题。

    下面是一个简单的例子,还是生产pc和pad的一个工厂。

     
    /**
     * @file test_factory_method.cpp
     * @author itegel
     * @date 2013/09/16 10:50:40
     * @brief 还是生产电脑的问题
     *  
     **/
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    //product
    class Computer{
    public:
        Computer(){}
        ~Computer(){}
        virtual void WhoIam(){ 
            cout<<"Computer!"<<endl;
        }
        virtual void Compute(string expr){
            cout<<"computing "<<expr<<"..."<<endl;
        }
        
        virtual void Display(string content){
            cout<<"Display: "<<content<<endl;
        }
    };
    
    class PC: public Computer{
    public:
        PC(){}
        ~PC(){}
        virtual void WhoIam(){
            cout<<"PC!"<<endl;
        }
        virtual void Compute(string expr){
            cout<<"PC computing "<<expr<<"... used 0.0000001ms"<<endl;
        }
    };
    
    class IPad: public Computer{
        public:
        IPad(){}
        ~IPad(){}
        virtual void WhoIam(){
            cout<<"IPad!"<<endl;
        }
        virtual void Compute(string expr){
            cout<<"IPad conputing "<<expr<<"... used 0.001ms"<<endl;
        }
    } ;
    
    //factory, so simple, no extention is implemented
    template <class T>
    class Creator{
    public:
        Creator(){}
        ~Creator(){}
        //factory method
        virtual T * CreateComputer(){
            return new T();
        }
    
    
    };
    
    
    //client
    int main(){
        Computer * computer = NULL;
    
        //PC
        cout<<"start produce pc and do some job!"<<endl;
        Creator<PC> *creator = new Creator<PC>();
        computer = creator->CreateComputer();
        computer->WhoIam();
        computer->Compute("1+1=");
        computer->Display("2");
        delete creator;
        delete computer;
    
        //IPad
        cout<<endl<<"start produce IPad and do some job!"<<endl;
        Creator<IPad> *creator2 = new Creator<IPad>();
        computer = creator2->CreateComputer();
        computer->WhoIam();
        computer->Compute("1+1=");
        computer->Display("2");
        delete computer;
    
        return 0;
    }
    
    

    运行结果如下:

    start produce pc and do some job!
    PC!
    PC computing 1+1=... used 0.0000001ms
    Display: 2
    
    start produce IPad and do some job!
    IPad!
    IPad conputing 1+1=... used 0.001ms
    Display: 2

    从效果看,工厂方法的引入,使得产品的具体创建过程对客户封闭,而对于具体产品的扩展却是开放的。用户想增加一个产品,只需要从product抽象类继承一个子类出来,并实现其接口即可。

    抽象工厂,抽象方法和构造器都是创建型模型中使用非常多的,也是面向对象设计中最基本的几种模式。要解决的问题均相似,只是在应用场景上稍有差别。很多时候这几个还交叉使用。比如抽象工厂中,也可以通过工厂方法或建造者,获取具体产品。而建造者只是更关注产品的组装过程,产品的单个部分的创建也可以使用其他模式生成。



  • 相关阅读:
    spring hibernate 调用存储过程
    Mybatis mapper配置
    流量红包算法
    带搜索的下拉框Chosen
    生成二维码
    Linux netlink机制
    OpenFlow Switch学习笔记(七)——Matching Fields
    Hierarchical Token Bucket
    OpenvSwitch架构
    Examining Open vSwitch Traffic Patterns
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3324919.html
Copyright © 2020-2023  润新知