zoukankan      html  css  js  c++  java
  • 学习笔记——工厂模式Factory

    Product是我们所需要获得的对象,一般的使用中,我们直接通过new获得新对象。

    当需要大量获得对象时,每一次都new会很麻烦。

    《真菌世界》游戏中,一个星球上有很多树,一棵树会不断生成真菌。星球是场景,树就是工厂,真菌就是产品。场景不用关心如何生成一种特定类型的真菌,真菌的属性由生产它的工厂负责就行了。

    简单代码示例:

    C++示例

    BaseFungus.h

    1 #pragma once
    2 class CBaseFungus
    3 {
    4 public:
    5     CBaseFungus(void);
    6     ~CBaseFungus(void);
    7 public:
    8     virtual void Fight();
    9 };

    BaseFungus.cpp

     1 #include "BaseFungus.h"
     2 #include <iostream>
     3 
     4 
     5 CBaseFungus::CBaseFungus(void)
     6 {
     7 }
     8 
     9 
    10 CBaseFungus::~CBaseFungus(void)
    11 {
    12 }
    13 
    14 void CBaseFungus::Fight()
    15 {
    16     std::cout<<"Base fungus fight"<<std::endl;
    17 }

    Fungus.h

     1 #pragma once
     2 #include "basefungus.h"
     3 class CFungus :
     4     public CBaseFungus
     5 {
     6 public:
     7     CFungus(void);
     8     ~CFungus(void);
     9 public:
    10     void Fight();
    11 };

    Fungus.cpp

     1 #include "Fungus.h"
     2 #include <iostream>
     3 
     4 
     5 CFungus::CFungus(void)
     6 {
     7 }
     8 
     9 
    10 CFungus::~CFungus(void)
    11 {
    12 }
    13 
    14 void CFungus::Fight()
    15 {
    16     std::cout<<"Fungus fight"<<std::endl;
    17 }

    Tree.h

     1 #pragma once
     2 #include "BaseFungus.h"
     3 
     4 class CTree
     5 {
     6 public:
     7     CTree(void);
     8     ~CTree(void);
     9 public:
    10     CBaseFungus* GetFungus();
    11 };

    Tree.cpp

     1 #include "Tree.h"
     2 #include "Fungus.h"
     3 
     4 
     5 CTree::CTree(void)
     6 {
     7 }
     8 
     9 
    10 CTree::~CTree(void)
    11 {
    12 }
    13 
    14 CBaseFungus* CTree::GetFungus()
    15 {
    16     return new CFungus();
    17 }

    main.cpp

     1 #include <iostream>
     2 #include "Tree.h"
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     CTree* pTree = new CTree();
     8     CBaseFungus* pFungus = pTree->GetFungus();
     9 
    10     pFungus->Fight();
    11 
    12     delete pFungus;
    13     delete pTree;
    14 
    15     return 0;
    16 }

    C#示例

    CBaseFungus.cs

     1 namespace Factory
     2 {
     3     class CBaseFungus
     4     {
     5         public CBaseFungus()
     6         {
     7 
     8         }
     9 
    10         public virtual void Fight()
    11         {
    12             Console.WriteLine("Base fungus fight");
    13         }
    14     }
    15 }

    CFungus.cs

     1 namespace Factory
     2 {
     3     class CFungus: CBaseFungus
     4     {
     5         public CFungus()
     6         {
     7         }
     8 
     9         public override void Fight()
    10         {
    11             Console.WriteLine("Fungus fight");
    12         }
    13     }
    14 }

    CTree.cs

     1 namespace Factory
     2 {
     3     class CTree
     4     {
     5         public CTree()
     6         {
     7 
     8         }
     9 
    10         public CFungus GetFungus()
    11         {
    12             return new CFungus();
    13         }
    14     }
    15 }

    Program.cs

     1 namespace Factory
     2 {
     3     class Program
     4     {
     5         static void Main(string[] args)
     6         {
     7             CTree tree = new CTree();
     8             CFungus fungus = tree.GetFungus();
     9             fungus.Fight();
    10         }
    11     }
    12 }

    1.如果一棵树可以生成不同的真菌,那么可以直接在创建方法中增加传递参数,通过参数来判断生成哪种真菌,也可以不同的真菌使用不同的函数来产生(2)。

    2.如果一棵树现在生产的是真菌飞机,树升级后可以生产另一类真菌炮。目前的接口仅为真菌飞机服务的,新增的真菌炮如何生产?我们可以为树增加生产真菌炮的接口,然后在这个接口中专门生产真菌炮。

    3.如果真菌飞机类型A1、A2,真菌炮类型B1、B2,不同的树T1、T2可以按不同的组合来生产,如何操作?这个时候采用抽象工厂模式,不同的树有着共同的接口,具体实现中,按各自的组合来分别实现接口。

  • 相关阅读:
    POJ-2018 Best Cow Fences(二分加DP)
    POJ-2039 To and Fro
    POJ-2029 Get Many Persimmon Trees(动态规划)
    POJ-2081 Recaman's Sequence
    POJ-2081 Terrible Sets(暴力,单调栈)
    Java实现 LeetCode 740 删除与获得点数(递推 || 动态规划?打家劫舍Ⅳ)
    Java实现 LeetCode 739 每日温度(暴力循环)
    Java实现 LeetCode 739 每日温度(暴力循环)
    Java实现 LeetCode 739 每日温度(暴力循环)
    Java实现 LeetCode 738 单调递增的数字(暴力)
  • 原文地址:https://www.cnblogs.com/dev2007/p/3417875.html
Copyright © 2011-2022 走看看