工厂方法

  模型

  

工厂方法模式(factory method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。

工厂方法和简单工厂方法看起来大部分是一样的,只是在工厂这里,简单工厂是通过Switch语句进行选择然后实例化对象,而在工厂方法里面,对工厂进一步抽象,定义了一个工厂接口,让每一类产品对应一个工厂接口,在实例化具体产品的时候,要通过实现工厂接口的类进行。

两种方法的比较:

   工厂方法克服了简单工厂违背开放—封闭原则的缺点,又保持了封装对象创建过程的优点。

   它们都是集中封装了对象的创建,使得要更换对象时,不需要做大的改动就可实现,降低了客户程序与产品对象的耦合。工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。

  
示例

          在学习简单工厂的时候,我写过一个CPU生产的例子(简单工厂模式),现在把这个例子稍加改动,它就成了工厂方法的例子。如图:

 

在这里,将工厂类去掉,但是抽象出来Client接口,并让3个具体的工厂方法去实现这个接口。也就是说,用子类的Client8085,Client8080,Client8086去决定实例化哪一个类。通过这样的改动,将一个类的实例化延迟到了其子类。

代码如下:

namespace 生产CPU
{
    public class Cpu8086 : CPU  //8086CPU
    {
        public Cpu8086()
        {
            this.size = "8086";
            Console.WriteLine("生产的是8086CPU。");
        }

    }

    public class Cpu8080 : CPU  //8080CPU
    {
        public Cpu8080()
        {
            this.size = "8080";
            Console.WriteLine("生产的是8080CPU。");
        }

    }

    public class Cpu8085 : CPU  //8085CPU
    {
        public Cpu8085()
        {
            this.size = "8085";
            Console.WriteLine("生产的是8085CPU。");
        }

    }

    public class CPU  //CPU类
    {
        private string Size;

        public string size
        {
            get { return Size; }
            set { Size = value; }
        }

    }

    interface Client   //定义一个选择生产CPU的接口(客户的抽象)
    {
        CPU ChooseCpu();

    }

    class Client8086 : Client   //生产8086CPU的工厂类
    {
        public CPU ChooseCpu()
        {
            return new Cpu8086();
        }
    }

    class Client8085 : Client  //生产8085CPU的工厂类
    {
        public CPU ChooseCpu()
        {
            return new Cpu8085();
        }
    }

    class Client8080 : Client   //生产8080CPU的工厂类
    {
        public CPU ChooseCpu()
        {
            return new Cpu8080();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Client client = new Client8080();  //生产8080CPU
            CPU CpuType = client.ChooseCpu();
        }
    }
}

工厂方法虽然增加了额外的类,但是这样做是有好处的,例如:

  

时间: 2024-09-15 06:08:47

工厂方法的相关文章

工厂方法真的支持OCP 开闭原则吗?

问题描述 工厂方法真的支持OCP 开闭原则吗? 开闭原则:我们在设计一个模块的时候应当使这个模块可以在不被修改的前提下被扩展换句话说就是应当可以在不必修改源代码的情况下改变这个模块的行为.工厂方法增加新的方法类的时候,不是要修改接口.然后再修改所有的相关类么.这岂不是违背了开闭原则 解决方案 工厂什么的都只是假象,利用反射可以

一番话:设计模式之工厂方法。

考虑一个问题.我们现在需要一个类的实例来协助我们完成某项功能.这在面向对象的开发过程中是常见的.在使用这个类的实例的时候,我们还需要对他进行一些初始化的工作.另外,为了保证我们的代码具有一定的扩展性,我们不想关心这个类的具体细节,并且希望在将来问题发生变化的时候,我们可以不改变我们的代码就可以改变这个类的行为.现在问题在于,初始化工作同这个类的具体细节密切相关.类的行为不同,初始化的工作也不同.但是这个类本身只是提供一些辅助性的工作,在它的内部,也同样不关心外部调用环境,也就是我们的代码中的细节

EPower2002示例:运用工厂方法设计类

EPower2002示例:运用"工厂方法"设计类 1.新建一类库工程,命名为"VBNETDesignMode.vb"2.将Class1.vb删除3.在此工程中添加类,命名为"FactoryMethod.vb"4.在"FactoryMethod.vb"中添加产品类"Product".  (1)添加三个私有成员变量:mID,mName,mCreaDate  (2)添加三个公有属性:ID,Name,CreaDat

设计模式之工厂方法(FACTORY METHOD))(一)

设计 工厂方法 THE FACTORY METHOD 我们已经学会了简单工厂模式(Simple Factory Pattern),工厂(factory)思想贯穿于整个面向对象编程(OOP)以及其他一些设计模式的始终.如:生成器(Builder)模式.其间,一个单一的类扮演类似交通警察的角色,决定哪一个单一层次上的子类将被实例化. 工厂方法模式(Factory Method pattern)是对工厂(factory)思想进行了巧妙的延伸,它使得将超类的实例化延迟到它的每一个子类.这个模式没有具体的

Effective Java (1) 考虑用静态工厂方法代替构造器

一.前言 从今天开始计划用一个月的时间,通过写读书笔记的方式来记录阅读这本Java领域经典中的经典书籍 - Effective Java过程中自己所思所想,以备以后查阅,同时分享出去也希望可以帮助到其他人,废话不多说,现在开始第一篇:创建和销毁对象. 二.考虑用静态工厂方法代替构造器 ①. 一般我们有什么办法可以创建对象呢? 方法1: 使用类公有构造器. 方法2:使用类的静态方法返回一个实例. ②. 使用静态方法创建对象有什么优点? 优点1: 静态工厂方法的名字是由我们自己命名,而构造方法必须与

设计模式学习——工厂方法

简介: 上一篇我们介绍了简单工厂,还记得简单工厂的缺点么?忘了回去浏览一下(这里)!因为简单工厂创造了一个万能的上帝工厂类,它把所有的工作都包了.当我们增加一个新的产品的时候,我们仍需要修改工厂中的方法.而工厂方法改进了简单工厂这一缺点,并且保留了原有的优点.怎么做到的,继续看下去! 在工厂方法中,核心的工厂类摇身一变,变为一个抽象的工厂角色,而将具体的工作交给具体的子类去做.这个就是工厂方法对简单工厂的改进.言语表达不清,请看下面的类图. UML类图: 还是类图比较直观.从类图中,我们看到,原

设计模式的C++实现之工厂方法模式

工厂方法模式不同于简单工厂模式的地方在于工厂方法模式把对象的创建过程放到里子类里.这样工厂父对象和产品父 对象一样,可以是抽象类或者接口,只定义相应的规范或操作,不涉及具体的创建或实现细节. 其类图如下: 实例代码为: #pragma once class IProduct { public: IProduct(void); virtual ~IProduct(void); }; #pragma once #include "iproduct.h" class IPad : publi

用AspectJ实现工厂方法模式

工厂方法模式根据产品的等级结构使用对应的工厂来创建特定的产品,它一般包括抽象工厂.具体工厂和抽象产品.具体产品,每一个特定工厂用于创建一个对应的产品.模式的简易UML图例如下 下面是使用AspectJ实现的工厂方法模式UML图 抽象方面FactoryMethodProtocol很简单只定义了抽象pointcut createMethod用于捕捉特定应用的创建方法(也可以省略). FactoryMethodProtocol抽象方面 public abstract aspect FactoryMet

Java设计模式之工厂方法模式

一 .工厂方法(Factory Method)模式 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 二. 工厂方法模式角色与结构 抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关.任何在模式中创建的对象的工厂类必须实现这个接口. 具体工厂(Concrete

对《Java与模式》中工厂方法模式的异议

关于工厂方法的一点讨论,我们知道工厂方法属于类型创建模式,而抽象工厂属于对象创建模式,并且所谓的类创建模式就是把创建工作延迟到子类,而对象创建模式则将延迟到另一个对象. 并且设计模式中指出,类模式处理类和子类子间的关系,这些关系通过继承建立,是静态的,在编译时刻便确定下来.对象模式则处理对象之间的关系,是动态的,运行时刻是可以变化的,更具动态性. 工厂方法由于属于类型创建模式,因此它的创建工作由子类完成,而不是使用对象进行创建,并且在<设计模式>中工厂方法的动机一节有一个示例,它的类大致如下: