设计模式之:简单工厂

设计模式是用来服务程序员的,换而言之,我们成为了语言的用户。

                                                                                                                    —— fitz

为什么会有简单工厂模式的出现?

在类的设计中,我们或许会对某些具备相似特点的不同类不断的进行创建释放。

OO开发的核心特点是:高内聚、低耦合思想下的继承、封装、抽象、多态。

相似在于具备一定的共性,如所有的图形如果展现在GUI的程序中必然需要将其打印到屏幕上,此时打印这个动作便可以被抽象出来。再如数据库设计过程中,一般设置为client-server架构,client需要向数据库的server模块传输 sql命令,(即使是 胡乱发送,也可以视为错误命令),此时可以根据命令类型的不同如delete、insert再去细化。我们已经下意识就将命令这个类给抽象出来了。

不同在于,每个类都有自己特点,在GUI界面下的图形必然有各自的实现形式。

那么如何有效的满足这种需求呢?

我们可以写一个新的类,专门负责对象的建立和释放,创建完毕的对象的各种操作,和这个类没有任何关系。这个专门建立对象的类,向外暴漏创建对象的接口,供外部调用。工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。

我们考虑下如何实现吧。

比如,华强北电子厂根据销售在广东跑来的订单生产不同类型的电子产品,黑心资本家根据订单经常性的让员工今天生产以次充新的kindle,明天生产换屏iPhone。如何实现小型华强北呢?

  • 电子厂负责生产电子产品,电子产品分为电纸书、手机。电子产品作为父类,电纸书和手机作为子类继承父类方法。电子厂作为工厂负责提供产品。

完整代码

#include<iostream>#include<string>using namespace std;/*    e_book =0,    e_phone,    e_pad,    e_watch,    e_computer*/typedef enum e_type{
   
      create_e_book =0,    create_e_phone,    create_e_pad,    create_e_watch,    create_e_computer}e_type;#define DELETE_PTR(p) if((p)!= nullptr)\{\    delete p;\    p = nullptr;\}\// base classclass e_product{
   
       public:        e_product(){}         virtual ~e_product(){}            private:        e_product(const e_product&) = delete;        void operator = (const e_product&) =delete;           public:        virtual void start_product() = 0;        virtual void end_product() = 0;};
class e_book:public e_product{
   
       public:        e_book():device("kindle paperwhite 5"){             std::cout<<device<<std::endl;}        ~e_book(){}    public:        virtual void start_product(){
   
               std::cout<<"设备开机,阅读《人类简史》,"<<std::endl;        }        virtual void end_product(){
   
               std::cout<<"读累了,设备关机。"<<std::endl;        }      private:        string device;};class e_phone:public e_product{
   
       public:        e_phone():device("iphone 4s"){
   
               std::cout<<device<<std::endl;        }        ~e_phone(){}    public:        virtual void start_product(){
   
               std::cout<<"设备开启,打电话给乔布斯"<<std::endl;        }        virtual void end_product(){
   
               std::cout<<"跟乔帮主聊的很der,设备关闭。"<<std::endl;        }    private:        string device;};class product_Factory{
   
       public:        static e_product * create_product(e_type product_type){
   
               e_product * product_object = nullptr;            switch(product_type){
   
                   case create_e_book :{
   
                       product_object = new e_book();                    break;                }                case create_e_phone:{
   
                       product_object = new e_phone();                    break;                }                default:                break;            }            return product_object;        }};int main(){
   
       e_product *product = nullptr;    std::cout<<" 想看电子书了,意念创建一个函数请求 工厂帮我 创建 电子书"<<std::endl;    product = product_Factory::create_product(create_e_book);    if(product){
   
           product->start_product();        product->end_product();        DELETE_PTR(product);    }      std::cout<<" 想跟乔布斯骂一下cook的刀法精准,意念创建一个函数请求 工厂帮我 创建 手机"<<std::endl;    product = product_Factory::create_product(create_e_phone);    if(product){
   
           product->start_product();        product->end_product();        DELETE_PTR(product);    }}

7、运行结果

猜你喜欢

转载自blog.csdn.net/qq_41722524/article/details/124421968