博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式:工厂方法模式
阅读量:6266 次
发布时间:2019-06-22

本文共 3544 字,大约阅读时间需要 11 分钟。

之前写了

 

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

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

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

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

 

1 #region 工厂模式 2  3     // 产品 4     public abstract class Product 5     { 6         public string productName; 7     } 8  9     // 建造者10     //工厂方法是创建一个框架,让子类决定要如何实现具体的产品11     public abstract class Creator12     {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 : Product25     {26         public OneProduct()27         {28             productName = "OneProduct";29         }30     }31 32     public class TwoProduct : Product33     {34         public TwoProduct()35         {36             productName = "TwoProduct";37         }38     }39 40     public class FirstProduct : Product41     {42         public FirstProduct()43         {44             productName = "My FirstProduct";45         }46     }47 48     public class SecondProduct : Product49     {50         public SecondProduct()51         {52             productName = "My SecondProduct";53         }54     }55     #endregion56     //第一个建造工厂57     public class OneCreator : Creator58     {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 : Creator74     {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             #endregion24 25             Console.ReadLine();26         }

让我们来看一下依赖关系

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

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

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

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

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

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

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

 

 c++代码 

product

 
View Code
 
View Code
 
View Code
 
View Code

 调用

 
View Code

 

本文转自lpxxn博客园博客,原文链接:http://www.cnblogs.com/li-peng/archive/2013/02/17/2913568.html,如需转载请自行联系原作者

你可能感兴趣的文章
Java-Spring-获取Request,Response对象
查看>>
opencv项目报错_pFirstBlock==pHead解决办法
查看>>
MySQL日志
查看>>
Oracle性能优化之Oracle里的执行计划
查看>>
电脑如何连接远程服务器?听语音
查看>>
使用Xcode 查看objective-C的汇编代码
查看>>
Vue.js——60分钟快速入门
查看>>
设计模式 - 模板方法模式(template method pattern) 具体解释
查看>>
mysql判断一个字符串是否包含某子串 【转】
查看>>
a bad dream
查看>>
FD_CLOEXEC用法及原因_转
查看>>
element UI 的学习一,路由跳转
查看>>
RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较
查看>>
Spring JavaBean属性值的注入方式( 属性注入, 特殊字符注入 <![CDATA[ 带有特殊字符的值 ]]> , 构造器注入 )...
查看>>
【Linux】Linux下统计当前文件夹下的文件个数、目录个数
查看>>
Hibernate_14_数据连接池的使用
查看>>
Codeforces Round #271 (Div. 2) D. Flowers (递推 预处理)
查看>>
jacky自问自答-java并发编程
查看>>
Struts2+JSON数据
查看>>
zTree实现单独选中根节点中第一个节点
查看>>