资讯专栏INFORMATION COLUMN

设计模式之工厂方法模式

geekidentity / 2284人阅读

摘要:通过工厂方法模式的类图可以看到,工厂方法模式有四个要素工厂接口工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。使用场景创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。

0x01.定义与类型

定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化那个类,工厂方法让类的实例化推迟到子类中进行

类型:创建型

uml类图

代码

//工厂接口
public interface IFactory {
    IProduct createProduct();
}

//产品接口
public interface IProduct {
    void produce();
}

//工厂实现
public class Factory implements IFactory {
    @Override
    public IProduct createProduct() {
        return new Product();
    }
}

//产品实现
public class Product implements IProduct{
    @Override
    public void produce() {
        System.out.println("具体产品业务。");
    }
}

//应用 / 测试类
public class Test {
    public static void main(String[] args) {
        IFactory factory = new Factory();
        IProduct product = factory.createProduct();
        product.produce();
    }
}

应用 / 测试类输出结果

具体产品业务。

通过工厂方法模式的类图可以看到,工厂方法模式有四个要素:

工厂接口:工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。

工厂实现:在编程中,工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的工厂实现。

产品接口:产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用抽象类来代替,但要注意最好不要违反里氏替换原则。

产品实现:实现产品接口的具体类,决定了产品在客户端中的具体行为。

0x02.简单工厂对比工厂方法

简单工厂只有三个要素,他没有工厂接口,并且得到产品的方法一般是静态的。

因为没有工厂接口,所以在工厂实现的扩展性方面稍弱,可以算是工厂方法模式的简化版。

简单工厂如果发生变动是需要修改工厂方法,违反了开闭原则。

0x03.使用场景

创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度。

由于工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好。也就是说,当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。

总结的说

创建对象需要大量重复的代码

客户端(应用层)不依赖于产品类实例如何被创建、实现等细节

一个类通过其子类来指定创建那个对象(具有产品抽象)

0x04.优点

用户只需要关心所需要产品对应的工厂,无需关心创建细节

加入新产品符合开闭原则,提高可扩展性

0x05.缺点

类的个数容易过多,增加复杂度

增加了系统的抽象性和理解难度

0x06.实现样例

在线教育网站具有多种技术种类视频

视频工厂与视频类的定义

//视频工厂
public abstract class VideoFactory {
    public abstract Video getVideo();
}

//视频类
public abstract class Video {
    public abstract void produce();
}

Java视频的实现

//Java视频工厂
public class JavaVideoFactory extends VideoFactory {
    @Override
    public JavaVideo getVideo() {
        return new JavaVideo();
    }
}

//Java视频
public class JavaVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制Java课程视频");
    }
}

Python视频实现

//Python视频工厂
public class PythonVideoFactory extends VideoFactory {
    @Override
    public PythonVideo getVideo() {
        return new PythonVideo();
    }
}

//Python视频
public class PythonVideo extends Video{
    @Override
    public void produce() {
        System.out.println("录制Python课程");
    }
}

前端课程实现

//前端视频实现
public class FEVideoFactory extends VideoFactory {
    @Override
    public FEVideo getVideo() {
        return new FEVideo();
    }
}

//前端视频
public class FEVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制前端视频");
    }
}

应用与测试类实现

public class Test {

    public static void main(String[] args) {
        VideoFactory videoFactory = new JavaVideoFactory();
        Video video1 = videoFactory.getVideo();
        video1.produce();

        videoFactory = new PythonVideoFactory();
        Video video2 = videoFactory.getVideo();
        video2.produce();

        videoFactory = new FEVideoFactory();
        Video video3 = videoFactory.getVideo();
        video3.produce();
    }
}

输出结果

录制Java课程视频
录制Python课程
录制前端视频

实现UML类图

0x07.源码中的工厂方法

Collection.iterator()方法

每个集合的具体实现都有一个实现了Iterator的具体实现

Collection.iterator相当于是工厂方法

ArrayList中的iterator是其中的内部类的实现的工厂

public Iterator iterator() {
    return new Itr();
}
private class Itr implements Iterator {
    //省略了具体实现
}

使用私有内部类来实现具体产品,实现iterator方法,来生成具体的实现。

URLStreamHandlerFactory工厂

log4j, logback---->LoggerFactory

0x08.源码地址

工厂方法模式:https://github.com/sigmako/design-pattern/tree/master/factory-method

0x09.参考

慕课网设计模式精讲: https://coding.imooc.com/class/270.html

23种设计模式(2):工厂方法模式: https://blog.csdn.net/zhengzhb/article/details/7348707

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74755.html

相关文章

  • PHP面试常考设计模式——工厂模式

    摘要:工厂模式其实可以划分为简单工厂模式工厂方法模式抽象工厂模式等。简单工厂模式介绍简单工厂模式又称为静态工厂方法模式,它属于类创建型模式。此模式是对工厂方法模式的进一步扩展。 你好,是我琉忆,PHP程序员面试笔试系列图书的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面试常考之设计模式——工厂模式周三:PHP面试常考之设计模式——建造者模式周五:PHP...

    Jiavan 评论0 收藏0
  • 优才公开课笔记:php设计模式 (二)工厂模式

    摘要:但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。但是工厂方法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客户去扩展。 最近开展了三次设计模式的公开课,现在来总结一下设计模式在PHP中的应用,这是第二篇创建型模式之工厂模式。 设计模式的一般介绍在第一篇文章讲了,这里就不重复。 工厂模式 实现:定义一个用于创建对象的接口,让子类决定实...

    aisuhua 评论0 收藏0
  • 设计模式系列工厂模式

    摘要:设计模式之工厂模式工厂模式包括了简单工厂工厂方法和抽象工厂。工厂方法模式下面我们针对普通工厂模式的缺点进行优化。 设计模式之工厂模式 工厂模式包括了简单工厂、工厂方法和抽象工厂。下面我从java实际应用的角度分别介绍这三种模式。 简单工厂模式 下面看下JDBC中获取Connection的代码 public class ConnectionFactory { public Con...

    MrZONT 评论0 收藏0
  • 一天一个设计模式JS实现——工厂模式

    摘要:参考文章深入理解三种工厂模式工厂模式,工厂方法模式,抽象工厂模式详解工厂模式是中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 参考文章:深入理解java三种工厂模式工厂模式,工厂方法模式,抽象工厂模式 详解 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的...

    Muninn 评论0 收藏0
  • 工厂模式(一)抽象工厂模式

    摘要:主要详解简单工厂模式到抽象工厂模式的演变。抽象工厂模式当一个类别的产品还有多个系列区分时,为了按系列生产商品,使用抽象工厂区分。 主要详解简单工厂模式到抽象工厂模式的演变。 简单工厂模式 即静态工厂模式1.将对象的创建和使用分开;2.将生产过程集中,便于集中管理;3.当需要创建的对象类有变动时,就不用在所有new 的地方修改了,直接修改工厂类即可; /** * 简单工厂模式 ---...

    woshicixide 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<