Java之二:工厂模式

来源:互联网 发布:图片二维码识别软件 编辑:程序博客网 时间:2024/04/27 13:01

本博文主要介绍工厂模式的三种模式:简单工厂模式、工厂方法模式、抽象工厂模式

工厂模式:

    Java程序系统中,工厂模式是我们最常用的模式因为工厂模式就相当于创建实例对象的new,我们经常使用的a=new A()可以用工厂模式创建实例对象来代替。虽然这样做,可能多做一些工作,但会给系统带来更大的可扩展性和尽量少的修改量。

    根据Java面向对象的原则封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成每段,将每段再“封装”起来(减少段和段之间耦合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。

    例如,当一个接口Sample拥有两个子类ASample和BSample,我们需要分别实例化他们: 

    Sample mysample=new ASample();

    Sample hissample=new BSample();

    但是随着项目的深入,Sample可能还会"生出很多儿子出来", 那么我们要对这些儿子一个个实例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传统程序中是无法避免的.

    但是如果使用工厂模式,就可以免去这些烦恼。

角色定义:

    抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

    具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

    抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。

    具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

简单工厂模式:

    简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。


使用场景:

    1. 工厂类负责创建的对象比较少;

    2. 客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;

    3. 由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

工厂方法模式

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

    一抽象产品类派生出多个具体产品类;一抽象工厂类派生出多个具体工厂类;每个具体工厂类只能创建一个具体产品类的实例。即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)。“一对一”的关系。


使用场景:

   1. 当一个类不知道它所必须创建的对象的类的时候。

    2. 当一个类希望由它的子类来指定它所创建的对象的时候。

    3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

抽象工厂模式:

    与工厂方法模式的区别在于需要创建对象的复杂程度上,多个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;每个具体工厂类可创建多个具体产品类的实例。即提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体的类。“一对多”的关系。


使用场景:

    1. 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。

    2. 这个系统有多于一个的产品族,而系统只消费其中某一产品族。

    3. 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。

    4. 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

由于博主知识有限,如有误,请指正点评,欢迎交流

0 0
原创粉丝点击