设计模式-简单工厂模式

前言

在介绍简单工厂模式之前先介绍介绍 创建模式


何谓创建模式?

创建模式就是对类的实例化过程的抽象化。通俗的讲,一个系统在创建对象时,需要动态的决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象,创建模式描述了怎样构造和封装这些动态的决定。


创建模式的分类

创建模式分为 类的创建模式对象的创建模式
  • 类的创建模式:类的创建模式使用继承关系,把类的创建延迟到子类,从而封装了客户端将得到哪些具体类的信息,并且隐藏了这些类的实例是如何被创建和放在一起的;
  • 对象的创建模式:对象的创建模式则把对象的创建过程委派给另外一个对象,从而动态的决定客户端将得到哪些具体类的实例,以及这些类的实例是如何被创建和组合在一起的,典型的应用Spring的beanFactory。


简单工厂模式相关定义及结构


简单工厂模式(Simple Factory)定义

简单工厂模式是类的创建模式,又叫做静态工厂方法模式,它由一个工厂对象决定创建出哪一种产品类的实例。


工厂模式的形态

共舱模式专门负责将大量有共同接口的类实例化,并且可以动态的决定将哪一个类实例化。工厂模式主要有以下几种形态:
  • 简单工厂(Simple Factory)模式:又称静态工厂方法模式;
  • 工厂方法(Factory Method)模式:又称多态性工程模式或虚拟构造模式;
  • 抽象工厂(Abstract Factory)模式:又称工具箱模式。
看着这些可能比较蒙圈,还是来个简单的类图吧,大概的就知道了工厂模式的大概的结构了:


角色与结构

由上面的类图可以看出,简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一种产品类的实例。简单的工程模式涉及到工厂角色、抽象产品角色以及具体产品角色:
  • 工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的业务逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体的Java类实现,举个很简单的例子,guava相信绝大部分人都使用过,针对Collection和Map都采用工厂模式的方式来创建具体的实例,当然java库里多线程部分也有工厂模式的具体使用,详见current包下的Excutors类;
  • 抽象产品(Product)角色:担任这个角色的类是由工厂模式所创建的对象的父类或者是它们共同拥有的接口,抽象的产品角色在java中可以是interface或者abstract类;
  • 具体产品(Concrete Product)角色:抽象产品的具体实现。
文字描述不管怎么说还是比较苍白,下面还是来一个具体使用简单工厂模式实现的一个小demo吧。


自定义简单工厂模式

只给一个很简单的demo,可以算是一个通用的简单工厂模式的架子。
  • 需求:计算四边形面积(两种四边形,正方形和长方形)
  • 抽象设计:
    • 抽象角色:按照工厂模式的角色,分出各个角色:Creator角色负责创建四边形;抽象四边形角色:具体的四边形(这里只给出正方形和长方形);
    • 类图:

  • 具体代码实现:
    • Creator
/**
 * Created by miaomiao on 16/10/28.
 */
public class Creator {

    public static Parallelogram factory(float length, float width) {
        switch(judgeShape(length, width)) {
            case RECTANGLE:
                return new Rectangle(length, width);
            case SQUARE:
                return new Square(length);
        }
        return new Rectangle(length, width);
    }

    private static ParallelogramTypeEnum judgeShape(float length, float width) {
        if (length == width) {
            return ParallelogramTypeEnum.SQUARE;
        } else {
            return ParallelogramTypeEnum.RECTANGLE;
        }
    }
}
    • Parallelogram:
/**
 * Created by miaomiao on 16/10/28.
 */
public interface Parallelogram {

    /**
     * 计算面积
     * @return
     */
    public float calculateArea();

}
    • Rectangle:
/**
 * Created by miaomiao on 16/10/28.
 */
public class Rectangle implements Parallelogram {

    private float length = 0f;

    private float width = 0f;

    public Rectangle() {

    }

    public Rectangle(float length, float width) {
        this.length = length;
        this.width = width;
    }

    public float calculateArea() {
        return length * width;
    }
}
    • Square:
/**
 * Created by miaomiao on 16/10/28.
 */
public class Square implements Parallelogram {

    private float length;

    public Square() {

    }

    public Square(float length) {
        this.length = length;
    }

    public float calculateArea() {
        return length * length;
    }
}
    • 实际测试
/**
 * Created by miaomiao on 16/10/28.
 */
public class SimpleFactoryPatternTest {
    @Test
    public void run() {
        float length = 5f, width = 3f;
        float rectangleArea = Creator.factory(length, width).calculateArea();
        float squareArea = Creator.factory(length, length).calculateArea();
        System.out.println("the area of rectangle is " + rectangleArea);
        System.out.println("the area of square is " + squareArea);
    }
}


简单工厂模式的优点和缺点


简单工厂模式的优点

简单工程模式的核心是工厂类,这个类一定有必要的逻辑判断,来决定在什么时候创建哪一个产品类的实例。这样子客户端就可以免除直接创建产品的责任,着重关注消费产品。简单工厂模式通过这种做法实现了对责任的分割。


简单工厂模式的缺点

大量的判断逻辑放在了工厂的创建类里,导致这个角色的负担过重,一旦它不能正常的工作,整个系统就会收到影响。同时,它不满足“开-闭”原则。


简单工厂模式在Java中的应用

Java的API中有很多地方都用到了简单工厂模式,比如DateFormat,XMLReaderFactory,Excutors等等,详细源码讲解将会在后文中一次呈现。


后记

跟简单工厂模式相关的一些问答题。
  • 大家看书可能都会看到简单工厂模式介绍一开篇就说:工厂模式就是在不使用new操作符的情况下,将类实例化的嘛,为什么看代码的过程中发现仍然使用了new操作符?
答:其实对整个系统来说,工厂模式只是把具体使用new操作符的细节做了一个包装,不把这些细节暴露给调用方。当然,java语言的特征在细节中肯定会有所体现的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简单工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在此模式中,我们使用一个工厂类来创建不同类型的对象,而不是在代码中直接实例化对象。 对于你提到的三角形和圆形的创建和擦除,我们可以使用简单工厂模式来实现。首先,我们需要定义一个形状接口,它包含画图和擦除方法。然后,我们可以创建两个实现这个接口的类,分别是三角形和圆形类。接下来,我们创建一个工厂类,它包含一个方法,该方法接受一个字符串参数,根据参数的不同返回三角形或圆形对象。 以下是一个简单的示例代码,用于演示如何使用简单工厂模式来创建和擦除三角形和圆形: ```java interface Shape { void draw(); void erase(); } class Triangle implements Shape { @Override public void draw() { System.out.println("Draw a triangle."); } @Override public void erase() { System.out.println("Erase a triangle."); } } class Circle implements Shape { @Override public void draw() { System.out.println("Draw a circle."); } @Override public void erase() { System.out.println("Erase a circle."); } } class ShapeFactory { public static Shape createShape(String type) { if (type.equals("triangle")) { return new Triangle(); } else if (type.equals("circle")) { return new Circle(); } else { throw new IllegalArgumentException("Invalid shape type."); } } } public class Main { public static void main(String[] args) { Shape triangle = ShapeFactory.createShape("triangle"); triangle.draw(); triangle.erase(); Shape circle = ShapeFactory.createShape("circle"); circle.draw(); circle.erase(); } } ``` 在上面的代码中,我们首先定义了一个Shape接口,并创建了Triangle和Circle类来实现它。接下来,我们创建了一个ShapeFactory工厂类,它包含一个createShape方法,该方法根据传入的参数返回不同的形状对象。最后,我们在主方法中使用ShapeFactory来创建和擦除三角形和圆形。 这是一个简单的示例,演示了如何使用简单工厂模式来创建和擦除不同类型的形状。在实际应用中,我们可以使用工厂模式来创建和管理更复杂的对象,可以提高代码的可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值