设计模式学习 - 简单工厂模式

一. 简单工厂模式简介

定义

  • 简单工厂模式又称之静态工厂方法模式,由一个工厂类对象决定创建出哪类产品的实例。通俗的讲,就是通过传参的方式,在工厂类中判断,找出对应的实例返回。
  • 在现实中,工厂是负责生产产品的。在设计模式中,简单工厂模式也可以理解为负责生产某个类的实例对象。

UML结构图

这里写图片描述

  • Factory:工厂类,负责创建所有实例对象的内部逻辑,外部可以调用创建实例对象的方法,来得到所需的产品对象;可以理解为工厂中流水线,不同流水线负责生产不同的产品。
  • Product:具体产品类,可以理解已经成型的产品,等待出货。
  • IProduct:抽象产品类,是所有产品类的父类,可以理解为所有产品共用的零部件。

简单工厂模式的实现

实现步骤

  1. 创建抽象产品类,定义所有产品的公共接口。
  2. 创建具体产品类,继承于产品抽象类,
  3. 创建工厂类,在内部定义静态方法,生产每个具体产品类的实例。
  4. 外部通过调用工厂类的静态方法,并传入参数来得到所需的产品。

实例

某玩具工厂同时接到了三个不同客户的订单,需要生产一批玩具汽车、玩具飞机、玩具火车。于是工厂开设三条流水线进行生产作业。

代码实现:

一、 创建抽象类,定义产品的公共接口

public abstract class Product {

    public abstract void created();

}

二、创建各个具体产品类,继承于抽象产品类,并实现父类的created方法。

public class ToyProduct extends Product{

    @Override
    public void created() {
        System.out.println("玩具汽车已经生产完毕");
    }

}

public class AircraftProduct extends Product{

    @Override
    public void created() {
        System.out.println("玩具飞机已经生产完毕");
    }

}


public class TrainProduct extends Product{

    @Override
    public void created() {
        System.out.println("玩具火车已经生产完毕");
    }

}

三、 创建工厂类,并提供一个静态方法来生产不同的产品,只需传入对应客户类型就可以生产客户需要的产品。

public class ProductFactory {

    public static Product createProduct(String type){
        Product mProduct=null;
        switch (type) {
        case "客户1":
            mProduct= new ToyProduct();
            break;
        case "客户2":
            mProduct=new TrainProduct();
            break;
        case "客户3":
            mProduct=new AircraftProduct();
            break;
        default:
            throw new NullPointerException("没有"+type+"的产品");
        }

        return mProduct;
    }

}

四、外部调用工厂类的静态方法,并传入客户类型名称得到产品对象并调用created方法。

public class Test {

    public static void main(String[] args) {

        try {
            Product product1 = ProductFactory.createProduct("客户1");
            Product product2 = ProductFactory.createProduct("客户2");
            Product product3 = ProductFactory.createProduct("客户3");
            product1.created();
            product2.created();
            product3.created();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        try {
            Product product4 = ProductFactory.createProduct("客户4");
            product4.created();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }

}

运行结果:

玩具汽车已经生产完毕
玩具火车已经生产完毕
玩具飞机已经生产完毕
没有客户4的产品

从结果上看出,在工厂类中并没有定义“客户4”的类型下,此时会抛出异常,就此说明了使用简单工厂模式,必须先清楚每个类的具体实例是什么。否则,在外部调用传入未定义的类型,则整个工厂类就会崩溃。

简单工厂模式优缺点及应用场景

优点

  • 用户无需关注内部具体实现,只需传入参数就可以得到对应的类实例,避免了直接实例化类,封装具体实现逻辑,降低了与使用者的耦合性。

缺点

  • 在实例化类型的时候,必须先知道每个类的具体类型。如果增加新类型,则需要修改工厂类中的静态方法,这不符合开放封闭原则。

应用场景

在知道了简单工厂模式的优缺点,应用场景很明了了

  • 客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时。
  • 当工厂类负责创建的对象(具体产品)比较少时。

感谢:
《大话设计模式》、《设计模式之禅》、《Android进阶之光》

猜你喜欢

转载自blog.csdn.net/hzw2017/article/details/80740485