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

来源:互联网 发布:必发数据 下载 编辑:程序博客网 时间:2024/05/21 22:53

java设计模式参考文章:
Java设计模式实战,23种设计模式介绍以及在Java中的实现,Java设计模式, Java经典设计模式之五大创建型模式


简单工厂模式(静态工厂模式)

## 定义 ##

简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

## 代码举例 ##

// 抽象水果类public interface Fruit {    void get();}// 具体水果类public class Apple implements Fruit {    public void get() {        System.out.println("采集苹果");    }}// 具体水果类2public class Banana implements Fruit {    public void get() {        System.out.println("采集香蕉");    }}// 工厂类public class FruitFactory {    public static Fruit getFruit(String type) throws IllegalAccessException, InstantiationException, ClassNotFoundException {        Class fruit = Class.forName(type);        return (Fruit) fruit.newInstance();    }}

## 优点 ##

 1. 隐藏了对象创建的细节,将产品的实例化过程放到了工厂中实现。 2. 客户端基本不用关心使用的是哪个产品,只需要知道用工厂的那个方法(或传入什么参数)就行了. 3. 方便添加新的产品子类,每次只需要修改工厂类传递的类型值就行了。 4. 遵循了依赖倒转原则。

## 缺点 ##

 1. 适用于产品子类型差不多, 使用的方法名都相同的情况. 2. 每添加一个产品子类,都必须在工厂类中添加一个判断分支(或一个方法),这违背了OCP(开放-封闭原则)

## 解析 ##

很容易看出,简单工厂模式是不易维护的,如果需要添加新的产品,则整个系统都需要修改。如果我们需要添加诸如梨子、葡萄等产品,直接在工程类中添加即可。但是如果这时候根部不知道还有什么产品,只有到子类实现时才知道,这时候就需要工厂方法模式。而在实际应用中,很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以实现起来是比较麻烦的,那么工厂方法模式正式解决这个问题的,下面就介绍工厂方法模式。

工厂方法模式

## 定义 ##

由于静态工厂方法模式不满足OCP, 因此就出现了工厂方法模式; 工厂方法模式和静态工厂模式最大的不同在于: 静态工厂模式只有一个(对于一个项目/独立模块)只有一个工厂类,而工厂方法模式则有一组实现了相同接口的工厂类.

## 代码举例 ##

// 产品接口public interface Fruit {    void get();}// 产品工厂接口public interface FruitFactory {    Fruit getFruit();}// 具体产品1public class Apple implements Fruit {    public void get() {        System.out.println("采集苹果");    }}// 具体产品工厂1public class AppleFactory implements FruitFactory {    public Fruit getFruit() {        return new Apple();    }}// 具体产品2public class Banana implements Fruit {    public void get() {        System.out.println("采集香蕉");    }}// 具体产品工厂2public class BananaFactory implements FruitFactory {    public Fruit getFruit() {        return new Banana();    }}

## 优点 ##

基本与静态工厂模式一致,多的一点优点就是遵循了开放-封闭原则,使得模式的灵活性更强。

## 缺点 ##

与静态工厂模式差不多, 但是增加了类组织的复杂性;

## 解析 ##
可以看一下工厂方法模式在collection集合的具体应用

抽象产品类派生出多个具体产品类;抽象工厂类派生出多个具体工厂类;每个具体工厂类只能创建一个具体产品类的实例。即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)。“一对一”的关系。与简单工厂间的取舍:工厂方法模式和简单工厂模式在定义上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式,把核心放在一个实类上。工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来,从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。反过来讲,简单工厂模式是由工厂方法模式退化而来。设想如果我们非常确定一个系统只需要一个实的工厂类, 那么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来,我们就退化到简单工厂模式了。可以看出工厂方法的加入,使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。如果再分得详细一点,一个工厂可能不只是生产手机(如小米除了手机,连电饭锅都有),但有得工厂智能生成低端的产品,而大一点的工厂可能通常是生成更高端的产品。所以一个工厂是不够用了,这时,就应该使用抽象工厂来解决这个问题。
原创粉丝点击