设计模式之工厂方法模式

标签: 工厂模式
5人阅读 评论(0) 收藏 举报
分类:

使用工厂模式创建对象时,我们不需要对客户端暴露创建逻辑,只需要通过一个共同的接口(工厂)来创建即可,从而使得代码简洁易懂。

工厂方法模式中有以下几个元素:

  • 产品:要创建的对象
  • 工厂:用于创建产品的媒介

在介绍工厂方法模式之前,先介绍一下简单工厂
简单工厂的实现十分简单:

  1. 共同的产品接口
  2. 产品类实现产品接口
  3. 提供工厂类,用于创建不同的产品

以生产汽车为例

1.共同的产品接口

public interface Car {
    void run();
}

2.具体的产品

public class Audi implements Car{

    @Override
    public void run() {
        System.out.println("Audi run");
    }
}
public class Byd implements Car {

    @Override
    public void run() {
        System.out.println("Byd run");
    }
}

3.创建工厂类,用于获取某一个具体的工厂
以下两种方式获取创建工厂类
方式一:通过传入字符串确定创建的产品

public class CarFactory {
    public static Car createCar(String type) {
        Car c = null;
        if ("Audi".equals(type)) {
            c = new Audi();
        } else if ("Byd".equals(type)) {
            c = new Byd();
        }
        return c;
    }
}

方式二:对每一种产品提供一个创建类

public class CarFactory {
    public static Car createByd() {
        return new Byd();
    }

    public static Car createAudi() {
        return new Audi();
    }
}

使用时,直接调用工厂类获取某个具体的产品

public static void main(String[] args) {
    Car car1 = CarFactory.createAudi();
    car1.run();

    Car car2 = CarFactory.createByd();
    car2.run();
}

简单工厂的结构十分简单易懂,但是从上例可以看出,简单工厂的扩展性很差。
如果我们要增加一个产品,则必须

1. 添加一个产品类
2. 添加相应的工厂方法

针对这个缺点,工厂方法模式进行了改进,准确来说,是针对第2点进行了改进。
上例中的产品接口和产品类我们暂时不修改,我们丢掉原来的工厂类,修改如下:

  1. 将工厂类接口化
  2. 具体的工厂生产具体的产品

1.工厂类接口化

public interface CarFactory {
    Car createCar();
}

2.具体的工厂生产具体的产品

public class AudiFactory implements CarFactory{

    @Override
    public Car createCar() {
        return new Audi();
    }
}
public class BydFactory implements CarFactory{

    @Override
    public Car createCar() {
        return new Byd();
    }
}

这样我们在调用的时候,只需要指定特定的工厂,就能产生相应的产品了

public static void main(String[] args) {
    Car car1 = new BydFactory().createCar();
    car1.run();

    Car car2 = new AudiFactory().createCar();
    car2.run();
}

如果要增加一件产品,在工厂方法模式中,只需要添加相应的实现类和实现工厂即可,不需要进入工厂类之中修改代码了。
但是比较简单工厂可以看出,工厂方法模式的缺点在于扩展的时候需要改动的内容变多了,不够简洁

这里简单总结一下简单工厂和工厂方法模式
简单工厂模式:

  • 工厂类一般使用静态方法,通过接收的参数的不同来返回不同的对象
  • 对于增加新产品无能为力,不修改代码的话,是无法扩展的。

工厂方法模式:

  • 避免了简单工厂模式的缺点,扩展性好,但较繁琐
  • 工厂方法模式和简单工厂模式的最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类
查看评论

Java设计模式—工厂方法模式&抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式。 通用类图如下:         在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;C...
  • qq_25827845
  • qq_25827845
  • 2016-09-11 15:07:17
  • 6155

工厂方法模式(Factory Method)-最易懂的设计模式解析

前言在上文提到的最易懂的设计模式系列解析:简单工厂模式,发现简单工厂模式存在一系列问题: 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响; 违背“开放 - 关闭...
  • carson_ho
  • carson_ho
  • 2016-08-28 08:31:39
  • 7136

C#设计模式01-工厂方法模式(附源码)

在简单工厂模式中,工厂类负责创建所有产品的实例,这导致工厂类的职责太重,并且一旦工厂类无法正常工作,整个系统将会受到极大的影响,而且简单工厂模式并不能很好的符合开闭原则。为了解决简单工厂模式的这些缺点...
  • bhdxmaomi
  • bhdxmaomi
  • 2016-01-11 12:18:46
  • 739

设计模式之简单工厂方法模式和工厂方法模式

假设现在有一个网上车辆交易系统,可以买整车或者买该型车的零部件,现在有三种车型,林肯、凯迪拉克和别克,系统根据用户的选择来显示相应产品的具体信息,那么我们可以这样设计:     这样设计无疑是...
  • shuaijiasanshao
  • shuaijiasanshao
  • 2016-04-03 17:51:02
  • 3306

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

工厂方法模式简单介绍工厂方法模式是创建型设计模式之一。工厂方法模式是一种结构简单的模式,其在我们平时开发中应用很广泛。如 Android 中的 Activity 里的各个生命周期方法,以 onCrea...
  • AkaiC
  • AkaiC
  • 2016-10-29 22:20:44
  • 321

Python设计模式——工厂方法模式

工厂方法模式(Factory method pattern):如果子类的某个方法要根据情况来决定用什么类去实例化相关对象,那么可以考虑该模式。此模式可单独使用,也可在无法预知对象类型时使用(比方说,待...
  • qingyunianer
  • qingyunianer
  • 2015-03-07 10:30:40
  • 401

2.工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)(设计模式笔记)

分类: 1:创建型模式: 单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式; 2:结构型模式: 适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式 3:行为型模式:...
  • u012572955
  • u012572955
  • 2015-08-12 22:43:21
  • 1630

设计模式之简单工厂,工厂方法模式(c++)

问题描述 在面向对象系统设计中经常可以遇到以下的两类问题: 1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可...
  • u012219045
  • u012219045
  • 2017-03-05 15:01:03
  • 564

PHP设计模式系列(四):工厂方法模式

工厂方法模式工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory...
  • qq_32300363
  • qq_32300363
  • 2017-04-29 14:42:04
  • 562

Java设计模式菜鸟系列(四)工厂方法模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39760895 工厂方法模式(Factory Method)分为三种: 一、普通工厂模式。...
  • JAVE_LOVER
  • JAVE_LOVER
  • 2014-10-04 22:29:17
  • 2749
    个人资料
    持之以恒
    等级:
    访问量: 5万+
    积分: 1394
    排名: 3万+
    博客专栏
    最新评论