工厂模式实例

一.简单工厂模式又称静态工厂方法模式(Static Factory Method),它不是Gof 所讲的23种设计模式之一,但是它却是我们在编码过程中经常使用的方法之一。

1.静态工厂方法统一管理对象的创建。
静态工厂方法通过传入的参数判断决定创建哪一个产品的实例,封装了对象的创建,客户端只管消费,实现了对责任(模块)的分割。

2.静态工厂方法推迟了产品的实例化。
通过XML配置文件就能改变具体要创建的产品实例,修改为其它的产品实例,代码不须重新编译。

二.简单工厂模式还是有缺点的,后面的工厂方法模式和抽象工厂模式就是对这些缺点的改善。讲完了这三种模式将会有一个对比。以下以Nokia手机为例,采用简单工厂模式设计的源代码雏形。

view plaincopy to clipboardprint?
 
#pragma once  
#include <string>  
#include <iostream>  
class CNokia  
 
public:  
    CNokia(void);  
public:  
    virtual ~CNokia(void);  
public:  
    virtual bool MakeCall(const std::string & number) const = 0;  
};  
#include "Nokia.h"  
 
CNokia::CNokia(void)  
 
 
 
CNokia::~CNokia(void)  
 
 
 
#pragma once  
#include "nokia.h"  
 
class CN96 : public CNokia  
 
public:  
    CN96(void);  
public:  
    virtual ~CN96(void);  
public:  
    virtual bool MakeCall(const std::string & number) const;  
};  
 
 
#include "N96.h"  
 
CN96::CN96(void)  
 
    std::cout << "生产一部N96" << std::endl;  
 
 
CN96::~CN96(void)  
 
 
 
bool CN96::MakeCall(const std::string & number) const 
 
    std::cout << "我在用N96,拨打号码是:" <<  number.c_str() << std::endl;  
    return false;  
 
 
#pragma once  
#include "nokia.h"  
 
class CN95 :public CNokia  
 
public:  
    CN95(void);  
public:  
    virtual ~CN95(void);  
public:  
    virtual bool MakeCall(const std::string & number) const;  
};  
 
 
#include "N95.h"  
 
CN95::CN95(void)  
 
    std::cout << "生产一部N95" << std::endl;  
 
 
CN95::~CN95(void)  
 
 
 
bool CN95::MakeCall(const std::string & number) const 
 
    std::cout << "我在用N95,拨打号码是:" <<  number.c_str() << std::endl;  
    return false;  
 
 
 
 
 
#pragma once  
#include "N96.h"  
#include "N95.h"  
#include "N85.h"  
#include "N81.h"  
#include <cassert>  
class CNokiaSimpleFactory  
 
public:  
    CNokiaSimpleFactory(void);  
public:  
    ~CNokiaSimpleFactory(void);  
public:  
          
    static CNokia * CreateNokia(const std::string & model);  
};  
 
#include "NokiaSimpleFactory.h"  
 
CNokiaSimpleFactory::CNokiaSimpleFactory(void)  
 
 
 
CNokiaSimpleFactory::~CNokiaSimpleFactory(void)  
 
 
 
CNokia * CNokiaSimpleFactory::CreateNokia(const std::string & model)  
 
    if (model == "N96")  
    {  
        return new CN96();  
    }  
    else if (model == "N95")  
    {  
        return new CN95();  
    }  
    else if (model == "N85")  
    {  
        return new CN85();  
    }  
    else if (model == "N81")  
    {  
        return new CN81();  
    }  
    else 
    {  
        assert(false);  
    }  
    return NULL;  
 
 
 
 
#include "stdafx.h"  
#include "NokiaSimpleFactory.h"  
 
int _tmain(int argc, _TCHAR* argv[])  
 
    CNokia * nokia = NULL;  
         
    std::string modeName = "N96";  
    nokia = CNokiaSimpleFactory::CreateNokia(modeName);  
    nokia->MakeCall("123456789");  
        delete nokia;  
    nokia = NULL;  
    return 0;  

 

转自:http://blog.csdn.net/chollima/archive/2009/03/12/3985570.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个Java抽象工厂模式实例,该实例演示了如何使用抽象工厂模式创建不同操作系统下的按钮和文本框: ```java // 创建抽象工厂接口 interface GUIFactory { Button createButton(); TextField createTextField(); } // 创建具体工厂类 - Windows工厂 class WindowsFactory implements GUIFactory { public Button createButton() { return new WindowsButton(); } public TextField createTextField() { return new WindowsTextField(); } } // 创建具体工厂类 - MacOS工厂 class MacOSFactory implements GUIFactory { public Button createButton() { return new MacOSButton(); } public TextField createTextField() { return new MacOSTextField(); } } // 创建抽象产品接口 - 按钮 interface Button { void paint(); } // 创建具体产品类 - Windows按钮 class WindowsButton implements Button { public void paint() { System.out.println("Windows Button"); } } // 创建具体产品类 - MacOS按钮 class MacOSButton implements Button { public void paint() { System.out.println("MacOS Button"); } } // 创建抽象产品接口 - 文本框 interface TextField { void paint(); } // 创建具体产品类 - Windows文本框 class WindowsTextField implements TextField { public void paint() { System.out.println("Windows TextField"); } } // 创建具体产品类 - MacOS文本框 class MacOSTextField implements TextField { public void paint() { System.out.println("MacOS TextField"); } } // 创建客户端类 class Application { private Button button; private TextField textField; public Application(GUIFactory factory) { button = factory.createButton(); textField = factory.createTextField(); } public void paint() { button.paint(); textField.paint(); } } // 测试代码 public class Main { public static void main(String[] args) { // 创建Windows工厂 GUIFactory factory = new WindowsFactory(); // 创建应用程序 Application app = new Application(factory); // 绘制UI app.paint(); // 创建MacOS工厂 factory = new MacOSFactory(); // 创建应用程序 app = new Application(factory); // 绘制UI app.paint(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值