码迷,mamicode.com
首页 > 其他好文 > 详细

浅谈简单工厂与工厂方法

时间:2015-04-08 19:29:10      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

  在园子混迹许久,每日看一些大神的佳作,深感受益匪浅,进而萌生了分享一些知识的想法。当然,作为一个屌丝程序员分享不了多么高大上的知识,只是把平时工作中积累的一些东西共享出来,希望大神们手下留情,不要拍的太狠。呵呵,闲言少叙,书归正传。 
简单工厂和工厂方法 
  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,分离客户端创建产品类的过程,从而将产品类和客户端解耦 

浅谈简单工厂与工厂方法

标签:

原文地址:http://www.cnblogs.com/zmwang/p/4403377.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!