炒冷饭系列:设计模式 工厂方法模式

一、什么是工厂方法模式

工厂方法模式同样属于类的创建型模式又被称 为多态工厂模式 。工厂方法模式的意义是定义一个创建
产品对象的工厂接口,将实际创建工作推迟到子类当中。 核心工厂类不再负责产品的创建,这样核心类成为一个
抽象工厂角色,仅负责具体工厂子类必须实现的接口, 这样进一步抽象化的好处是使得工厂方法模式可以使系 统在不修改具体工厂角色的情况下引进新的产品。

二、模式中包含的角色及其职责

1.抽象工厂(Creator)角色
工厂方法模式的核心,任何工厂类都必须实现这个接口。

2.具体工厂( Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化产品对象。

3.抽象(Product)角色
工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

4.具体产品(Concrete Product)角色
工厂方法模式所创建的具体实例对象

注意:其实就是多出一套:定义一个创建 产品对象的工厂接口

在我们上一篇:简单工厂模式 其实是  工厂方法模式 的原理。

三.工厂方法模式实现

结构图:

                                 

类图UML:

 

Fruit.java Apple.java Banana.java

public interface Fruit
{
    /*
     * 采集
     */
    public void get();
}

public class Apple implements Fruit
{
    /*
     * 采集
     */
    public void get()
    {
        System.out.println("采集Apples");
    }
}

public class Banana implements Fruit
{
    /*
     *采集
     */
    public void get()
    {
        System.out.println("采集Banana");
    }
}

FruitFactory.java AppleFactory .java BananaFactory.java

public interface FruitFactory
{
    public Fruit getFruit();
}

public class AppleFactory implements FruitFactory
{

    @Override
    public Fruit getFruit()
    {
        return new Apple();
    }

}

public class BananaFactory implements FruitFactory
{

    public Fruit getFruit()
    {
        return new Banana();
    }

}

 

现在我们来测试下:

public class MainClass
{
    public static void main(String[] args)
    {
        //获得苹果工厂
        FruitFactory ff = new AppleFactory();
        //通过AppleFactory 获得 Apple实例对象
        Fruit apple = ff.getFruit();
        apple.get();

        //获得BananaFactory
        FruitFactory ff2 = new BananaFactory();
        //通过AppleFactory 获得 Apple实例对象
        Fruit banana = ff2.getFruit();
        banana.get();

    }
}

运行可以看到下面的输出:



采集Apples
采集Banana

 

这个模式的好下面我们来增加一种水果Pear:

PearFactory.java Pear.java

public class PearFactory implements FruitFactory
{

    public Fruit getFruit()
    {
        return new Pear();
    }

}

public class Pear implements Fruit
{

    @Override
    public void get()
    {
        System.out.println("采集Pears");
    }

}

然后测试代码如下:



//获得BananaFactory
FruitFactory ff3 = new PearFactory();
//通过AppleFactory 获得 Apple实例对象
Fruit pear = ff3.getFruit();
pear.get();

测试输出如下:



采集Apples
采集Banana
采集Pears

相关资料:

java 多态

四、工厂方法模式和简单工厂模式比较

工厂方法模式与简单工厂模式
结构上的不同不是很明显。工厂方 法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具
体类上。工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工
厂类都有共同的接口,或者有共同的抽象父类。当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对
象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也 不需要修改客

户端,很好的符合了“开放-封闭”原则OCP。而简单工厂 模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模式退化后可以演变成简单工厂模式

时间: 2024-09-20 20:20:01

炒冷饭系列:设计模式 工厂方法模式的相关文章

Android设计模式系列之工厂方法模式_Android

工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式. android中用到了太多的工厂类,其中有用工厂方法模式的,当然也有很多工厂并不是使用工厂方法模式的,只是工具管理类. 今天以ThreadFactory举例说明一下简单工厂模式和工厂方法模式. 工厂方法模式,Factory Method,简单的方式,不简单的应用. 1.意图 定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方式模式使一个类的实例化延迟到其子类. 热门词汇:虚构造器 延迟 创建对象

.NET设计模式-工厂方法模式(Factory Method)

工厂方法模式(Factory Method) --.NET设计模式系列之五 Terrylee,2004年1月2日 概述 在软件系统中,经常面临着"某个对象"的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?提供一种封装机制来隔离出"这个易变对象"的变化,从而保持系统中"其它依赖该对象的对象"不随着需求的改变而改变?这就是要说的Factory Method模式了. 意图 定义一个用户创

跟屌丝大哥学习设计模式--工厂方法模式

东汉<风俗通>记录了一则神话故事:"开天辟辟,未有人民,女娲搏,黄土作人--",讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹而洁净的自然环境,寂静而又寂寞,于是女娲决定创造一个新物种(即人类)来增加世界的繁荣,怎么制造呢?       别忘了女娲是神仙,没有办不到的事情,造人的过程是这样的:首先,女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是意外随时都会发生:       第一

解读设计模式----工厂方法模式(FactoryMethod Pattern)

概述: Factory Method模式是应用最为广泛的设计模式,毕竟他负责了一系列对象的创建,而对象的创建正是面向对象编程中最为繁琐的行为.GOF在<设计模式>一书写到,"Factory Method模式使一个类的实例化延迟到子类."准确的说,Factory Method模式是将创建对象实例的责任,转移到了工厂类中,并利用抽象原理,将实例化行为延迟到具体工厂类. 意图: 定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method模式使一个类的实例

java设计模式之工厂方法模式_java

概要 设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美. 定义 定义一个用于创建对象的接口,让其子类去决定实例化那个类 使用场景 任何使用复杂对象的地方,都可以使用工厂模式 UML 1.抽象工厂  抽象工厂:我们都知道,工厂,一般只有一个作用,那就生产,比如,吉利汽车厂,那就制造吉利汽车,iphone手机制造厂就造iphone等等 所以可以用一个简单的方法概括,就是create(); 2.具体汽车制造厂  具体汽车制造厂:实现了抽象工厂,具有实际的制造汽车的流程和方法等

举例解析设计模式中的工厂方法模式在C++编程中的运用_C 语言

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

Java设计模式编程之工厂方法模式的使用_java

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 类型:创建类模式 类图: 工厂方法模式代码 interface IProduct { public void productMethod(); } class Product implements IProduct { public void productMethod() { System.out.println("产品"); } } interface IFactory { publ

Java使用设计模式中的工厂方法模式实例解析_java

工厂方法模式的定义工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 它包含了如下角色: 抽象产品(Product) 具体产品(ConcreteProduct) 抽象工厂(Factory) 具体工厂(ConcreteFactory) 模式的UML类

设计模式系列之二:工厂方法模式

前言 前一篇博文中介绍了简单工厂模式,这里再介绍一下工厂方法模式.与简单工厂很像,那么两者的区别是什么呢?在这篇博文中,首先会简单介绍一下工厂方法的使用方法,并对工厂方法模式进行简单的小结.最后,将结合具体的例子对比简单工厂模式与工厂方法模式,并对两者的使用场景做一个小小的归纳. 问题背景 背景: 某公司开发了一个A软件,数据库使用的是SQLServer.后由于客户要求需要使用Oracle数据库,原来的数据要迁移到Oracle中,在迁移的过程中遇到很多问题,比如语法错误,关键字滥用,函数不支持等