浅谈简单工厂与工厂方法

在园子混迹许久,每日看一些大神的佳作,深感受益匪浅,进而萌生了分享一些知识的想法。当然,作为一个屌丝程序员分享不了多么高大上的知识,只是把平时工作中积累的一些东西共享出来,希望大神们手下留情,不要拍的太狠。呵呵,闲言少叙,书归正传。 
简单工厂和工厂方法 
  GOF创造了设计模式这个家族,为我们写出更面向对象的代码提供了便利。相对于这个家族几乎代代单传,工厂家族可谓是门丁兴旺,今天主要来体验下简单工厂和工厂方法。 
  这里要说一个题外话,简单工厂模式不属于GOF创造的23种设计模式,最多算一个临时工,出了问题的时候,上镜率较高。 
  简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实 
现。 
  简单点说,可以讲工厂模式比喻成淘宝商铺,而Creator的角色淘宝卖家。对于买家来说,只需要告诉卖家自己要什么,至于这个东西从那个货架下来,进货价格是多少(应该不会有好心的卖家告诉你进货价格是多少吧),就和客户没一毛钱关系没有了,因为这些具体的实现细节是没有必要也是不应该告诉调用曾的。 
看一下类图: 
 
示例代码: 
public class Creator 
    { 
        private Product product;

public Product Product 
        { 
            get 
            { 
                return product; 
            } 
        }

private Product CreateProduct(int type) 
        { 
            switch (type ) 
            { 
                case 1: 
                    product = new ProductA(); 
                    break; 
                case 2: 
                    product = new ProductB(); 
                    break; 
                case 3: 
                    product = new ProductC(); 
                    break; 
                default: 
                    product = null; 
                    break; 
            } 
            return null; 
        }


  在Creator类中,由CreateProduct方法返回Product的一个实例,具体实例化哪一个类由CreateProduct的逻辑决定。使用这个模式,我们可以轻松的将客户端对具体产品的依赖去除。 
  请大家养成一个好习惯,在写完代码后可以去对照SOLID原则来审查一下自己的代码。我们明显的可以发现,Creator类违反了开闭原则(OCP)。当我们增加一个Product实现的时候,就必然的需要在Creator类中修改CreateProduct方法。这时候就需要工厂方法出马了。

工厂方法模式(Factory Method)定义了一个用于创建对象的接口,让子类来决定实例化哪一个类。工厂方法使一个类的实例化被延迟到其子类。 
类图: 

示例代码: 
抽象创建类: 
public abstract class Creater 
    { 
        public Product product;

abstract public void CreateProduct();

public void ConstructObjects() 
        { 
            //必须要创建对象 
            CreateProduct(); 
        } 
    }

创建类: 
public class ConcreteCreater : Creater 
    { 
        public override void CreateProduct() 
        { 
            //throw new NotImplementedException(); 
            product = new ConcreteProduct(); 
        } 
    } 
抽象产品类: 
public abstract class Product 
    { 
        abstract public void Test(); 
    } 
产品类: 
public class ConcreteProduct : Product 
    { 
        public override void Test() 
        { 
            //throw new NotImplementedException(); 
            Console.Write("This is facoty method sample"); 
        } 
    }

这样在新添加一个产品类A的时候,对应的需要在Product中添加一个子类ConcreteProductA,并且在Create中添加一个子类ConcreteCreaterA。 
以上简单的比较了简单工厂和工厂方法。写完不禁需要思考一个问题:在什么情况下使用工厂模式? 
我个人觉得有以下几个方面,也希望各路大神不吝赐教。

1,需要隐藏产品类的实现细节。 
2,分离客户端创建产品类的过程,从而将产品类和客户端解耦

时间: 2024-08-06 02:07:49

浅谈简单工厂与工厂方法的相关文章

浅谈php设计模式(1)---工厂模式

一.接口继承直接调用 先看看这样一段代码: 1 <?php 2 3 interface db{ 4 function conn(); 5 } 6 7 class dbmysql implements db { 8 public function conn(){ 9 echo "连接到了mysql"; 10 } 11 } 12 13 class dbsqlite implements db{ 14 public function conn(){ 15 echo "连接到了

浅谈Java中的hashcode方法 - 海 子

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 一.hashCode方法的作用 对于包含容器类型的程

浅谈JAVA中的“hashcode()”方法

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 一.hashCode方法的作用 对于包含容器类型的程

浅谈控件(组件)制作方法一(附带一delphi导出数据到Excel的组件实例)(原创)

来自:http://blog.csdn.net/zhdwjie/article/details/1490741 ------------------------------------------------------------------- 从99年学习delphi开始,我就被它的快速开发迷上了,那时候刚接触编程,对可视化开发特别来劲,原因嘛,不外乎是比C更快的实现啦,这几年来,从delphi的C/S到三层B/S,大大小小也写过一些软件,自认为这delphi也就这么些功能吧,自从最近偶得一

浅谈 js 正则之 test 方法

原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. ? 1 2 3 4 5 var re = /\d/; console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1"

浅谈简单工厂,工厂方法,抽象工厂的区别和使用

工厂模式是分为三种,分别是简单工厂,工厂方法,抽象工厂.其中工厂方法和抽象工厂是GoF23种设计模式中的一种,而简单工厂则不是一种设计模式,更加可以理解的是一种编码时候预定俗称的一种习惯.那么,就在接下来三点中分别去分析理解工厂模式. 一 简单工厂:通过实例化一个工厂类,来获取对应的产品实例.我们不需要关注产品本身如何被创建的细节,只需要通过相应的工厂就可以获得相应的实例.简单工厂包括三种角色: 1.工厂:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类的创建产品类的方法可以被外界直

浅谈简单工厂,工厂方法,抽象工厂的使用

前言 这几天了解了工厂模式,自己也整理下思路,任何一种模式的出现都是为了让我们的程序有更好的可扩展性,工厂模式也不例外. 简单工厂 在实际的代码coding中我们在创建对象(也就是实例化一个类)的时候往往需要new class()这样来操作.举个例子: 这是项目结构 //这是一个中国人的类public class ChinesePepole { public void Show() { Console.WriteLine("I'm a {0}", this.GetType().Name

浅谈简单工厂模式和策略模式

1.简单工厂模式如图 代码: 缺点:简单工厂模式需要客户端认识两个类,Cash和CashFactory 优点:子类的实例化被工厂封装了起来,客户端看不到 2.策略模式如图 代码: public class Context{ Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public double getResult(double money){ return strategy.a

浅谈JAVA设计模式之——工厂方法(FactoryMethod)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45440937 一.概述 定义一个用于创建对象的接口,让子类决定实例化哪一个类.FactoryMethod使一个类的实例化延迟到其子类. 二.适用性 当一个类不知道它所必须创建的对象的类的时候. 当一个类希望由它的子类来指定它所创建的对象的时候. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候. 三.参与者 1.Produc