设计模式:工厂方法模式

之前写了

 设计模式系列目录

今天说一下工厂方法模式:

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类

所谓的决定并不是批模式允许子类本身在运行时做决定,而是指在编写创建者类时,不需知道创建的产品是哪一下,选择了使用

哪个子类,就决定了实际创建的产品是什么。

 

 1 #region 工厂模式
 2
 3     // 产品
 4     public abstract class Product
 5     {
 6         public string productName;
 7     }
 8
 9     // 建造者
10     //工厂方法是创建一个框架,让子类决定要如何实现具体的产品
11     public abstract class Creator
12     {
13         public Product FactoryMethod(string f_ProductType)
14         {
15             Product _product;
16             _product=CreateProduct(f_ProductType);        //可对产品做其它的操作......
17             return _product;
18         }
19         //让子类去实现要生产什么产品
20         public abstract Product CreateProduct(string f_Type);
21
22     }
23     #region  产品
24     public class OneProduct : Product
25     {
26         public OneProduct()
27         {
28             productName = "OneProduct";
29         }
30     }
31
32     public class TwoProduct : Product
33     {
34         public TwoProduct()
35         {
36             productName = "TwoProduct";
37         }
38     }
39
40     public class FirstProduct : Product
41     {
42         public FirstProduct()
43         {
44             productName = "My FirstProduct";
45         }
46     }
47
48     public class SecondProduct : Product
49     {
50         public SecondProduct()
51         {
52             productName = "My SecondProduct";
53         }
54     }
55     #endregion
56     //第一个建造工厂
57     public class OneCreator : Creator
58     {
59         public override Product CreateProduct(string f_Type)
60         {
61             switch (f_Type)
62             {
63                 case "one":
64                     return new OneProduct();
65                 case "two":
66                     return new TwoProduct();
67             }
68
69             return null;
70         }
71     }
72     //第二个建造工厂
73     public class TwoCreator : Creator
74     {
75         public override Product CreateProduct(string f_Type)
76         {
77             switch (f_Type)
78             {
79                 case "one":
80                     return new FirstProduct();
81                 case "two":
82                     return new SecondProduct();
83             }
84             return null;
85         }
86     }
87
88
89
90     #endregion
 1 static void Main(string[] args)
 2         {
 3
 4
 5             #region 工场模式
 6
 7
 8
 9             //第一个工厂 两种产品
10             Creator _creator = new OneCreator();
11             Product _product = _creator.FactoryMethod("one");
12             Console.WriteLine(_product.productName);
13             _product = _creator.FactoryMethod("two");
14             Console.WriteLine(_product.productName);
15
16             //第二个工厂  造另两种产品
17
18             Creator _tCreator = new TwoCreator();
19             Product _tProduct = _tCreator.FactoryMethod("one");
20             Console.WriteLine(_tProduct.productName);
21             _tProduct = _tCreator.FactoryMethod("two");
22             Console.WriteLine(_tProduct.productName);
23             #endregion
24
25             Console.ReadLine();
26         }

让我们来看一下依赖关系

我们会看到 Creator 和所有的产品(OneProduct、TwoProduct...)都依赖了Product.这是依赖倒置原则:要依赖抽象,不要依赖具体类

也就是说不能让具体产品去依赖Creator,不管是产品还是Creator都应该依赖于抽象

就用这个原则我们要尽量做到 

1变量不可以持有具体类的引用(如果使用new就会有具体类的引用。你可以改用工厂来避开这样的做法)

2不要让类派生自具体类(派生自一个接口)

3不要覆盖基类中已实现的方法

但在实际编程时不可能完全遵守这几条,我们只要尽量做就可以了

 

 c++代码 

product

#pragma once
#include <iostream>
#include <string>
using namespace std;

class Product
{
public:
    Product();
    virtual ~Product();

    string ProductName()
    {
        return m_rodutName;
    }
protected:
    string m_rodutName;

};

class OneProduct : public Product
{
public:
    OneProduct();
    virtual ~OneProduct();

};

class TwoProduct : public Product
{
public:
    TwoProduct();
    virtual ~TwoProduct();
};

View Code

#include "stdafx.h"
#include "Product.h"

Product::Product()
{

}

Product::~Product()
{

}

// One Product
OneProduct::OneProduct()
{
    m_rodutName = "One Prodect";
}

OneProduct::~OneProduct()
{

}

// TwoProduct

TwoProduct::TwoProduct()
{
    m_rodutName = "Two Prodect";
}

TwoProduct::~TwoProduct()
{

}

View Code

#pragma once

#include <iostream>
#include <string>

class Product;

class Creator
{
public:
    Creator();
    virtual ~Creator();

    Product* FactoryMehtod(const std::string& type);

    virtual Product* CreateProduct(const std::string& type) = 0;
};

class OneCreator : public Creator
{
    Product* CreateProduct(const std::string& type);
};

View Code

#include "stdafx.h"
#include "Creator.h"
#include "Product.h"

Creator::Creator()
{

}

Product* Creator::FactoryMehtod(const std::string& type)
{
    Product* product = CreateProduct(type);
    return product;
}

Creator::~Creator()
{

}

Product* OneCreator::CreateProduct(const std::string& type)
{
    if (type.compare("one")) {
        return new OneProduct();
    }
    else if (type.compare("two")) {
        return new TwoProduct();
    }
}

View Code

 调用

#include <iostream>
#include "Product.h"
#include "Creator.h"

int main()
{
    Creator *creator = new OneCreator();
    Product *pd = creator->CreateProduct("one");
    std::cout << pd->ProductName() << endl;
    delete pd;
    pd = creator->CreateProduct("two");
    std::cout << pd->ProductName() << endl;
    delete pd;
    delete creator;

}

View Code

 

 

时间: 2024-11-05 19:05:26

设计模式:工厂方法模式的相关文章

跟屌丝大哥学习设计模式--工厂方法模式

东汉<风俗通>记录了一则神话故事:"开天辟辟,未有人民,女娲搏,黄土作人--",讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹而洁净的自然环境,寂静而又寂寞,于是女娲决定创造一个新物种(即人类)来增加世界的繁荣,怎么制造呢?       别忘了女娲是神仙,没有办不到的事情,造人的过程是这样的:首先,女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是意外随时都会发生:       第一

.NET设计模式-工厂方法模式(Factory Method)

工厂方法模式(Factory Method) --.NET设计模式系列之五 Terrylee,2004年1月2日 概述 在软件系统中,经常面临着"某个对象"的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?提供一种封装机制来隔离出"这个易变对象"的变化,从而保持系统中"其它依赖该对象的对象"不随着需求的改变而改变?这就是要说的Factory Method模式了. 意图 定义一个用户创

炒冷饭系列:设计模式 工厂方法模式

一.什么是工厂方法模式 工厂方法模式同样属于类的创建型模式又被称 为多态工厂模式 .工厂方法模式的意义是定义一个创建 产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责产品的创建,这样核心类成为一个 抽象工厂角色,仅负责具体工厂子类必须实现的接口, 这样进一步抽象化的好处是使得工厂方法模式可以使系 统在不修改具体工厂角色的情况下引进新的产品. 二.模式中包含的角色及其职责 1.抽象工厂(Creator)角色 工厂方法模式的核心,任何工厂类都必须实现这个接口. 2.具体工厂(

解读设计模式----工厂方法模式(FactoryMethod Pattern)

概述: Factory Method模式是应用最为广泛的设计模式,毕竟他负责了一系列对象的创建,而对象的创建正是面向对象编程中最为繁琐的行为.GOF在<设计模式>一书写到,"Factory Method模式使一个类的实例化延迟到子类."准确的说,Factory Method模式是将创建对象实例的责任,转移到了工厂类中,并利用抽象原理,将实例化行为延迟到具体工厂类. 意图: 定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method模式使一个类的实例

举例解析设计模式中的工厂方法模式在C++编程中的运用_C 语言

工厂方法模式不同于简单工厂模式的地方在于工厂方法模式把对象的创建过程放到里子类里.这样工厂父对象和产品父对象一样,可以是抽象类或者接口,只定义相应的规范或操作,不涉及具体的创建或实现细节. 其类图如下: 实例代码为: #pragma once class IProduct { public: IProduct(void); virtual ~IProduct(void); }; #pragma once #include "iproduct.h" class IPad : public

Java设计模式编程之工厂方法模式的使用_java

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 类型:创建类模式 类图: 工厂方法模式代码 interface IProduct { public void productMethod(); } class Product implements IProduct { public void productMethod() { System.out.println("产品"); } } interface IFactory { publ

Java使用设计模式中的工厂方法模式实例解析_java

工厂方法模式的定义工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 它包含了如下角色: 抽象产品(Product) 具体产品(ConcreteProduct) 抽象工厂(Factory) 具体工厂(ConcreteFactory) 模式的UML类

java设计模式之工厂方法模式_java

概要 设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美. 定义 定义一个用于创建对象的接口,让其子类去决定实例化那个类 使用场景 任何使用复杂对象的地方,都可以使用工厂模式 UML 1.抽象工厂  抽象工厂:我们都知道,工厂,一般只有一个作用,那就生产,比如,吉利汽车厂,那就制造吉利汽车,iphone手机制造厂就造iphone等等 所以可以用一个简单的方法概括,就是create(); 2.具体汽车制造厂  具体汽车制造厂:实现了抽象工厂,具有实际的制造汽车的流程和方法等

设计模式的C++实现之工厂方法模式

工厂方法模式不同于简单工厂模式的地方在于工厂方法模式把对象的创建过程放到里子类里.这样工厂父对象和产品父 对象一样,可以是抽象类或者接口,只定义相应的规范或操作,不涉及具体的创建或实现细节. 其类图如下: 实例代码为: #pragma once class IProduct { public: IProduct(void); virtual ~IProduct(void); }; #pragma once #include "iproduct.h" class IPad : publi

.NET设计模式:工厂方法模式(Factory Method)

概述 在软件系统中,经常面临着"某个对象"的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?提供一种封装机制来隔离出"这个易变对象"的变化,从而保持系统中"其它依赖该对象的对象"不随着需求的改变而改变?这就是要说的Factory Method模式了. 意图 定义一个用户创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 结构图 生活中