设计模式之:简单工厂

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

                                                                                                                    —— 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、运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃瓜太狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值