在现实生活中我们可以看见,乐事在卖薯片,可比克也在卖.
我敢肯定的说它们各自都有自己的工厂来生产薯片,而且生产出来的薯片味道还是不一样的.
这就是我们这里所谓的工厂方法模式. 我们来看看这个模式的UML图:

这个模式中我们可以看到:
产品和工厂2个基类,然后它们下面又有些子孙类.
--------------------------------------------------------------------------------
现在进入我们的代码环节了,首先上场的是PHP.

代码

 1 //抽象产品   
 2 abstract class Product{   
 3     abstract function Test();   
 4 }   
 5   
 6 class leshi extends Product {   
 7     public function Test() {   
 8         echo("Leshi!\n");   
 9     }   
10 }   
11 class kebike extends Product {   
12     public function Test() {   
13         echo("Kebike!\n");   
14     }   
15 }   
16 //抽象工厂   
17 abstract class Factory{   
18     abstract function GetProduct();   
19 }   
20   
21 class leshiFactory extends Factory{     
22     public function GetProduct() {   
23         return new leshi();   
24     }   
25 }   
26 class kebikeFactory extends  Factory{   
27     public function GetProduct() {   
28         return new kebike();   
29     }   
30 }   
31 //首先我们先建立两个公司的工厂.   
32 $leshiF = new leshiFactory();   
33 $kebikeF = new kebikeFactory();   
34 //每个工厂给我出10包薯片   
35 for($i=0;$i<10;$i++){   
36     $leshiF->GetProduct()->Test();   
37     $kebikeF->GetProduct()->Test();   
38 }  
39 
40 //抽象产品
41 abstract class Product{
42     abstract function Test();
43 }
44 
45 class leshi extends Product {
46     public function Test() {
47         echo("Leshi!\n");
48     }
49 }
50 class kebike extends Product {
51     public function Test() {
52         echo("Kebike!\n");
53     }
54 }
55 //抽象工厂
56 abstract class Factory{
57     abstract function GetProduct();
58 }
59 
60 class leshiFactory extends Factory{  
61     public function GetProduct() {
62         return new leshi();
63     }
64 }
65 class kebikeFactory extends  Factory{
66     public function GetProduct() {
67         return new kebike();
68     }
69 }
70 //首先我们先建立两个公司的工厂.
71 $leshiF = new leshiFactory();
72 $kebikeF = new kebikeFactory();
73 //每个工厂给我出10包薯片
74 for($i=0;$i<10;$i++){
75     $leshiF->GetProduct()->Test();
76     $kebikeF->GetProduct()->Test();
77 }
78 
79 

和简单工厂模式有点儿像,但是那个只有一个工厂实例,
而我们这里是有多少种产品就有多少个工厂实例
--------------------------------------------------------------------------------
 C#粉墨登场:

代码

namespace FactoryMethod_DesignPattern   
{   
    using System;   
  
    // These two classes could be part of a framework,   
    // which we will call DP   
    // ===============================================   
       
    class DPDocument    
    {   
       
  
    }   
  
    abstract class DPApplication    
    {   
        protected DPDocument doc;   
           
        abstract public void CreateDocument();   
  
        public void ConstructObjects()   
        {   
               
            // Create objects as needed   
            // . . .   
  
            // including document   
            CreateDocument();   
        }          
        abstract public void Dump();   
    }   
  
    // These two classes could be part of an application    
    // =================================================   
  
    class MyApplication : DPApplication    
    {   
        override public void CreateDocument()   
        {   
            doc = new MyDocument();            
        }              
  
        override public void Dump()   
        {   
            Console.WriteLine("MyApplication exists");   
        }   
    }      
  
    class MyDocument : DPDocument    
    {   
  
    }   
  
    /// <SUMMARY></SUMMARY>   
    ///    Summary description for Client.   
    ///    
    public class Client   
    {   
        public static int Main(string[] args)   
        {   
            MyApplication myApplication = new MyApplication();   
  
            myApplication.ConstructObjects();   
  
            myApplication.Dump();   
               
            return 0;   
        }   
    }   
}

namespace FactoryMethod_DesignPattern
{
    using System;

// These two classes could be part of a framework,
 // which we will call DP
 // ===============================================
 
 class DPDocument 
 {

}

abstract class DPApplication 
 {
  protected DPDocument doc;
  
  abstract public void CreateDocument();

public void ConstructObjects()
  {
   
   // Create objects as needed
   // . . .

// including document
   CreateDocument();
  }  
  abstract public void Dump();
 }

// These two classes could be part of an application 
 // =================================================

class MyApplication : DPApplication 
 {
  override public void CreateDocument()
  {
   doc = new MyDocument();   
  }

override public void Dump()
  {
   Console.WriteLine("MyApplication exists");
  }
 }

class MyDocument : DPDocument 
 {

}

/// 
    ///    Summary description for Client.
    /// 
    public class Client
    {
        public static int Main(string[] args)
        {
            MyApplication myApplication = new MyApplication();

myApplication.ConstructObjects();

myApplication.Dump();
   
            return 0;
        }
    }
}

--------------------------------------------------------------------------------
Delphi王者驾临!

Delphi

IProduct = interface 
    procedure Test; 
  end;

IFactory = interface 
    function GetProduct:IProduct; 
  end;

TLeShi = class(TInterfacedObject,IProduct) 
  public 
    procedure Test; 
  end;

TKeBiKe = class(TInterfacedObject,IProduct) 
  public 
    procedure Test; 
  end;

TLeShiFactory = class(TInterfacedObject,IFactory) 
  public 
    function GetProduct:IProduct; 
  end;

TKeBiKeFactory = class(TInterfacedObject,IFactory) 
  public 
    function GetProduct:IProduct; 
  end;

var 
  Form1: TForm1;

implementation

{$R *.dfm}

{ TKeBiKeFactory }

function TKeBiKeFactory.GetProduct: IProduct; 
begin 
  Result:=TKeBiKe.Create; 
end;

{ TLeShi }

procedure TLeShi.Test; 
begin 
  ShowMessage('LeShi!'); 
end;

{ TKeBiKe }

procedure TKeBiKe.Test; 
begin 
  ShowMessage('KeBiKe'); 
end;

{ TLeShiFactory }

function TLeShiFactory.GetProduct: IProduct; 
begin 
  Result:=TLeShi.Create; 
end;

--------------------------------------------------------------------------------
给乐事和可比克打了广告不知道能不能得到点儿广告费哟..哈哈.
我们最后看看这个模式的适用性:

当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

转载于:https://www.cnblogs.com/huangjacky/archive/2009/12/07/1618918.html

软件工程 - 设计模式学习之工厂方法模式Factory Method相关推荐

  1. 设计模式之六:工厂方法模式(Factory method Pattern)

    工厂方法(Factory Method)模式就是定义一个创建对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责具体产品的创建,仅提供了具体工厂子类必须实现的接口,这样核心类成为一个抽象 ...

  2. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  3. java简单工厂模式实例造车,JAVA设计模式学习5——工厂方法模式

    工厂方法模式(Factory Method)又称虚拟构造子模式,可以说是简单工厂的抽象,也可以理解为简单工厂是退化了的工厂方法模式,其表现在简单工厂丧失了工厂方法的多态性.我们前一节中提到当产品结构变 ...

  4. 工厂方法模式(Factory Method)简介

    工厂方法模式 名字 跟已经介绍的 简单工厂模式很类似. 实际上它们的模型也是十分相似的. 我们先看看工厂模式的定义. 一. 工厂方法(Factory Method)模式定义 教材上是这样写的: 工厂方 ...

  5. 设计模式学习-工厂方法模式

    在上文(设计模式学习-简单工厂模式)的模拟场景中,我们用简单工厂模式实现了VISA和MASTERARD卡的刷卡处理,系统成功上线并运行良好,突然有一天老大跑来说,我们的系统需要升级,提供对一般银联卡的 ...

  6. 【设计模式学习】工厂方法模式

    cpp学习设计模式:工厂方法模式 在学习工厂方法模式之前,先回忆前面学的简单工厂模式: 简单工厂模式就是将对象的创建和逻辑的判断都交给了一个工厂类去做,这样做的优点是客户端不需要知道具体产品类的类名和 ...

  7. 设计模式之工厂方法模式(Factory Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  8. 设计模式之工厂方法模式---factory method

    模式的介绍 模式的定义 Define an interface for creating an object,but let subclassed decide which class to inst ...

  9. 设计模式之工厂方法模式(Factory Method Pattern)

    一.工厂方法模式的诞生 在读这篇文章之前,我先推荐大家读<设计模式之简单工厂模式(Simple Factory Pattern)>这篇文档.工厂方法模式是针对简单工厂模式中违反开闭原则的不 ...

最新文章

  1. 漫水填充算法 - cvFloodFill() 实现
  2. VS2017调用MySQL 8.0(附上C++程序)
  3. 特征提取 notes
  4. 通过代码解决SharePoint列表视图权限分配问题
  5. Linux学习笔记-Makefile优化之头文件依赖
  6. JavaScript—事件
  7. 优酷APP响应式布局在消费场景的落地之Android篇
  8. 软件测试——第三次作业
  9. 发现《后端架构师技术图谱》
  10. 中颐软启动器说明书_中颐软启动器维修
  11. KVM 虚拟化技术 理论详解
  12. C语言struct 函数,C语言结构体史上最详细的讲解
  13. 完美解决vmware连接摄像头问题(驱动程序错误)
  14. UEFI电脑安装Win7并激活
  15. 抖音内容选题怎么做?有哪些找选题的办法?
  16. python对于字典d d.get(x、y)_字典的使用与操作
  17. 强连接运营社张强:三分钟学会社群运营,从这三个方面、六个引流涨粉技巧出发
  18. 看板管理方法的6大作用
  19. BERT文本分类实战
  20. Hope you never grow old.

热门文章

  1. oracle内存锁,Oracle OCP之硬解析在共享池中获取内存锁的过程
  2. python 深copy_python中的深copy和浅copy
  3. linux查看显卡核心数,linux查看硬件信息,linux查看硬盘信息,linux查看CPU信息,linux查看显卡,硬件型号信息 | 帮助信息-动天数据...
  4. 信号模型噪声服从零均值高斯分布_非高斯噪声下基于分数低阶循环谱的调制识别方法...
  5. JDom,jdom解析xml文件
  6. 学习笔记1-Linux1
  7. Android入门(13)| Android权限 与 内容提供器
  8. Bokeh——交互式可视化库
  9. 简单暴力到dp的优化(入门篇)
  10. UNIX(进程间通信):02---父子进程之间的数据共享分析