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

模式定义

又称静态工厂方法模式,它属于创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都是具有共同的父类。


简单工厂模式结构图

简单工厂模式包含如下角色:

1.Factory(工厂角色)

工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法,它返回一个抽象产品类Product,所有的具体产品都是抽象产品的子类。

2.Product(抽象产品角色)

抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。

3.ConcreteProduct(具体产品角色)

具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法。

模式分析

在简单工厂模式中,工厂类根据工厂方法所传入的参数来动态决定应该创建出哪一个产品类的实例。
实例:某销售管理系统支持多种支付方式,如现金支付、信用卡支付、代金券支付等,在设计中如果不使用简单工厂模式,可能会存在如下支付方法:

public class Pay {
    public void pay(String type){
        if(type.equalsIgnoreCase("cash")){
            //现金支付处理
        }else if(type.equalsIgnoreCase("creditcard")){
            //信用卡支付处理
        }else if(type.equalsIgnoreCase("voucher")){
            //代金券支付处理
        }
        //...
    }
}

使用简单工厂模式,可以对原有代码进行如下改进:
(1)为了保证系统的扩展性并将各种支付类型对象的创建封装在一个统一的方法中,需要引入抽象支付方式类,它定义了抽象的支付方法,抽象支付方法类定义如下:

public abstract class AbstractPay{
    public void pay(){
        //现金支付处理代码
    }
}

(2)将每一种支付方式封装在一个独立的类中,各个支付方式类相对独立,修改其中一个,对其他类无任何影响,这些独立的支付方式类充当了具体产品类的角色,是抽象支付方式类的子类,如现金支付类定义如下:

public class CashPay extends AbstractPay{
    public void pay(){
        //现金支付代码
    }
}

(3)提供一个代码相对简单,而且只负责创建对象而不必关心对象细节的工厂类来创建各种具体的支付方式产品类,注意其工厂方法的返回类型是抽象类型,支付方式工厂类定义如下:

public class PayMethodFactory {
    public static AbstractPay getPayMethod(String type){
        if(type.equalsIgnoreCase("cash")){
            return new CashPay();
        }else if(type.equalsIgnoreCase("creditcard")){
            return new CreditcardPay();
        }
    }
} 
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 创建型模式 抽象工厂模式(abstract facroty) 3.1模式动机 在工厂方法模式中具体工厂负责生产具体...
    僚机KK阅读 763评论 0 2
  • 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。通常我们所说的工厂模式是指工厂方法模...
    zfylin阅读 1,341评论 0 7
  • 一个UML类图 类之间的关系 类的继承结构表现在UML中为:泛化(generalize)与实现(realize) ...
    僚机KK阅读 680评论 0 0
  • 渡过2018年上半年是我人生中会计职业生涯的第一个年度,在这期间我完成以下事宜: 1、学习了基本的费用审核、成本控...
    崽儿9_9阅读 83评论 0 0
  • grep简介 在Linux里面,如果按照使用频率给命令排个序,那么grep绝对榜上有名。 grep的全称是Glob...
    flycash阅读 3,971评论 0 0