Factory Pattern(工厂模式)

1、工厂模式简介

  工厂模式,专门负责将大量有共同接口的类实例化(用来生产对象)。其定义为定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使一个类的实例化延迟到其子类。

  工厂模式拥有以下几种类型:

  • 简单工厂模式:又称为静态工厂模式
  • 工厂方法模式
  • 抽象工厂模式

2、简单工厂模式

  通过工厂类的静态方法来获取需要的对象。以下代码使用简单工厂模式来实现图形工厂,用来获取不同类型的图形。

  

  Shape抽象类定义:

public abstract class Shape {
    public abstract void info();
}

  Shape子类定义:

public class Rectangle extends Shape {

    @Override
    public void info() {
        System.out.println("rectangle");
    }

}
public class Circle extends Shape {

    @Override
    public void info() {
        System.out.println("circle");
    }
}

  ShapeFactory定义

public class ShapeFactory {

    public static <T extends Shape> T getShape(Class<T> c) {
        Shape shape = null;
        try {
            shape = (Shape) Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return (T) shape;
    }
}

  Cilent定义

public class Client {
    public static void main(String[] args) {
        Shape shape = ShapeFactory.getShape(Rectangle.class);
        shape.info();
    }
}

  Java中,DateFormat就是使用简单工厂模式的例子,它通过getDateInstance()方法来获取实例对象。

3、工厂方法模式

  工厂方法模式是简单工厂模式的衍生。在简单工厂模式中,工厂类集中了所有产品的创建逻辑,这会导致扩展的不利。同时简单工厂模式只在有限的程度上支持开闭原则,而工厂模式支持开闭原则。在以上代码中进行了优化,在简单工厂实现部分使用了反射来实例化对象,免去了自己编写代码实例化对象。但是如果产品类构造方法比较复杂,则需要自己使用构造方法来实例化,显然不支持开闭原则,每次添加新的产品时需修改工厂类。

  工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

  以下代码将简单工程模式的程序改为使用工厂方法模式:

  

  Shape、Rectangle、Circle同简单工厂,

  ShapeFactory:

public abstract class ShapeFactory {
    public abstract Shape create();
}

  RectangleFactory:

public class RectangleFactory extends ShapeFactory {

    @Override
    public Shape create() {
        return new Rectangle();
    }
}

  CircleFactory:

public class CircleFactory extends ShapeFactory {

    @Override
    public Shape create() {
        return new Circle();
    }
}

  Cilent:

public class Client {
    public static void main(String[] args) {
        ShapeFactory factory = new CircleFactory();
        factory.create().info();
    }
}

  在Java中,工厂模式被广泛应用,例如Collection的iterator()。

4、抽象工厂模式

  

  产品等级结构:AbstractProductA和AbstractProductB,即产品系列

  产品族:指位于不同产品等级结构中,功能相关联的产品组成的家族。换个角度,就是一个抽象工厂所能生产出来的产品集合。

  以下使用案例使用抽象工厂模式

  

  此例子中,UnixButton和UnixLabel为一个产品族,WinButton和WinLabel为一个产品族。Button和Label为产品等级结构。

public abstract class Button {}
public class UnixButton extends Button {}
public class WinButton extends Button {}

  Label同上代码,省略...

public abstract class AbstractFactory {
    public abstract Button createButton();
    public abstract Label createLabel();
}
public class UnixFactory extends AbstractFactory {

    @Override
    public Button createButton() {
        return new UnixButton();
    }

    @Override
    public Label createLabel() {
        return new UnixLabel();
    }

}
public class WinFactory extends AbstractFactory {

    @Override
    public Button createButton() {
        return new WinButton();
    }

    @Override
    public Label createLabel() {
        return new WinLabel();
    }

}

  增加新的产品族时,就意味着每一个产品等级结构中增加一个或多个新的具体或抽象产品角色。例如加入Android系列的,则只需要未Button和Label添加Andorid子类,再创建一个AndroidFactory。并不需要更改工厂角色和产品角色。符合“开闭原则”。

  增加新的产品等级结构时,例如增加Text,在工厂类中需要添加createText()方法,其子类都要进行实现。显然违背了“开闭原则”。

  Spring的IoC容器就是一个典型的抽象工厂模式。

5、总结

  简单工厂:只有一个产品等级结构,能生产任意产品。添加新产品时需要改动代码。不符合“开闭原则”;

  工厂方法:只有一个产品等级结构,一个工厂只能生产特定产品。添加新产品时只需继承抽象实现新工厂。符合“开闭原则”;

  抽象工厂:多个产品等级结构,能生产不同产品族的任意产品。添加产品族时符合“开闭原则”。

时间: 2024-10-19 23:57:08

Factory Pattern(工厂模式)的相关文章

设计模式(四)The Factory Pattern 工厂模式

一.简单工厂 定义:定义一个创建对象的接口,但是由其子类决定要实例化的对象是哪一个,工厂方法让类的实例化推迟到子类. 通俗的来讲就是由工厂方法确定一个框架,具体的实现由其子类来完成.与简单工厂相比,简单工厂可是完成了整个对象的创建. 严格的来说简单工厂并不是一种设计模式,他更像是一种编程习惯. 代码说明一切! 1.这是一个简单工厂 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package my.oschina

设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要强调一系列相关的产品对象的设计以便进行联合使用. 4.当你提供一个产品类库,而只想显示它们的接口而不是实现. 3.评价 1.它分离了具体的类 2.它使得易于交换产品系列 3.它有利于产品的一致性 4.难以支持新种类的产品 5."开放-封闭"原则要求系统对扩展开放,对修改封闭.通过扩展达到增

设计模式(四):SIMPLE FACTORY简单工厂模式 -- 创建型模式

1.定义 简单工厂模式又称静态工厂方法模式.重命名上就可以看出这个模式一定很简单.它存在的目的很简单:定义一个用于创建对象的接口. 2.适用场景 如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用.后来出现工业革命.用户不用去创建宝马车.因为客户有一个工厂来帮他创建宝马.想要什么车,这个工厂就可以建.比如想要320i系列车.工厂就创建这个系列的车.即工厂可以创建产品. 3.评价 优点: 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体

设计模式(四)The Factory Pattern 出厂模式

一.简单工厂 定义:定义一个创建对象的接口,可是由其子类决定要实例化的对象是哪一个,工厂方法让类的实例化推迟到子类. 通俗的来讲就是由工厂方法确定一个框架.详细的实现由其子类来完毕. 与简单工厂相比,简单工厂但是完毕了整个对象的创建. 严格的来说简单工厂并非一种设计模式,他更像是一种编程习惯. 代码说明一切! 1.这是一个简单工厂 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package my.oschina

c++ 设计模式9 (Abstract Factory 抽象工厂模式)

5.2 抽象工厂模式 动机:在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sql,Oracle等),有连接.命令.读取等功能. 其中命令,连接功能之间有相互联系. 方法一(使用工厂方法): 每个功能类有一个创建的工厂,如IDBConnection与IDBConnectionFactory 1 //数据库访问有关的基类 2 class IDBConnection{ 3

一天一个设计模式——Abstract Factory抽象工厂模式

一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂方法模式中,抽象工厂使用抽象的零件组装成抽象的产品.即使用包含特定的方法接口零件,将零件组装成抽象产品. 二.模式类图: 上面的类图中包含两个包:包含抽象工厂,抽象零件,抽象产品的类所在的包以及具体工厂实现类的包. 三.代码示例 1.Item类: package com.designpattern.

Java设计模式:Abstract Factory(抽象工厂)模式

概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品),而系统只消费其中某一族的产品.换句话说,抽象工厂创建一整套具有相互依赖或作用关系的产品(至少两个产品),而工厂方法中的工厂只能创建单一系列的产品. 应用场景 客户端不需要知道它所创建的对象的类. 需要一组对象共同完成某种功能时,并且可能存在多组对象完成不同功能的情况. 系统结构稳定,不会频繁地增加

Abstract Factory 抽象工厂模式

提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具体实现,创建一组具体的对象. 以下情况可以使用抽象工厂模式: 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关的产品对象的设计以便进行联合使用时. 当你提供一个产品类库,而只想显示它们的接口而不是实现时. 抽象工厂模式的优缺点: 他分离

11种常用设计模式之工厂模式

1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模式 Simple Factory 简单工厂模式又称静态工厂方法,它属于类创建模式.在简单工厂模式中,可以根据自变量的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类. 简单工厂模式的角色 1.工厂类(Creator),工厂模式的核心,含有与应用业务逻辑处理的代码. 2.抽象产品(A