设计模式之工厂模式

设计模式在编程过程中起到举足轻重的作用,一个项目完成离不开整理的设计和细节的设计。而框架的设计架构的设计固然重要,但是设计模式是实现整体架构的一个个支柱。

常见的工厂模式在构造对象实例,方便调用者使用和方便对象创造者的维护和扩展,按照GOF定义,工厂模式可分为:简单工厂模式、抽象工厂模式、方法工厂模式。

简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,主要是新增产品,就要修改工厂类。符合单一职责原则。不符合开放-封闭原则)

工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品,新增产品时不需要更改已有的工厂,需要增加该产品对应的工厂。符合单一职责原则、符合开放-封闭原则。但是引入了复杂性)

抽象工厂 :用来生产不同产品族的全部产品。(增加新产品时,需要修改工厂,增加产品族时,需要增加工厂。符合单一职责原则,部分符合开放-封闭原则,降低了复杂性)

代码的设计是根据场景的使用而进行合理和规范的设计,写的好的代码就是一个艺术设计的过程。通常我们在进行代码设计的时候主要遵循几个重要的原则进行考量,做到符合预期和优雅精简到代码。我们在决定采用何种设计模式来开发我们的项目的时候,一般常常遇到的问题就是,设计模式的合理性,能否解决我们的问题,能否提高代码的简洁易用,可扩展,可维护。但是,通常当前的主流开发模式,迭代开发,敏捷开发。需求从产生到编码设计的过程,没有很多时间给予你思考整体架构,和模块耦合,框架设计的合理,所以作为基层开发人员,在设计编码的时候能用上合理的设计模式往往是比较难能可贵的。这也是中国式生产方式的悲哀。

好,话归正传。对于工厂模式我们需要搞明白的亮点:

1.实例和实例的关系,我们如何用对象之间的继承,接口实现,抽象描述它们。

2.一个工厂能做的事情,在什么时候用到,解决什么样的场景就使用何种工厂。

先来说说简单工厂。对于归类明确,工厂职责明确的时候,但是类与类之前有着平行关系,一个工厂做一个事情。此时我们可宜采用简单的工厂,外部逻辑决定采用A工厂来进行生产,此时,实例出的是A的实例;B类工厂使用B实例;C类工厂使用C实例。

工厂模式的 UML 图上面的图示:circle、square、rectangle分别具有图形的共性,它们是类同的对象,都是形状。所以我们需要创建一个形状的工厂,由此来生产不同的图形。

工厂方法用来解决没一个工厂都对应又特定的能力,能为我们做不同的事情,但是它们都有一样的操作,可以理解为操作细节不同,但是生产过程是一样的。用类和对象来描述就是:

  • 一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;客户端需要知道创建具体产品的工厂类。
  • 一个类通过其子类来指定创建哪个对象:在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
  • 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
//工厂接口
public interface IFactory {
    Operation CreateOption();
}

//加法类工厂
public class AddFactory implements IFactory {
    public Operation CreateOption() {
        return new OperationAdd();
    }
}

//减法类工厂
public class SubFactory implements IFactory {
    public Operation CreateOption() {
        return new OperationSub();
    }
}

//乘法类工厂
public class MulFactory implements IFactory {
    public Operation CreateOption() {
        return new OperationMul();
    }
}

//除法类工厂
public class DivFactory implements IFactory {
    public Operation CreateOption() {
        return new OperationDiv();
    }
}

抽象工厂在面对实体对象比较复杂,每个产品都有自己的一些特性,但是大部分还是有相同的功能,这时,我们需要为每一种功能抽象为单个的对象,例如电子产品,电脑,手机等,其构造都是大同小异,但是外观却完全不同。

或许,我们在设计简单工厂模式进行生产的时候,针对越来越多的产品有更多的共性,我们需要一个 大工厂来负责所有流水线的组合,需要描述和抽象出更多的实例,满足对象的单一职责,已经对外生产的开闭原则,以及里氏替换原则。此时,我们把生产的订单交给一个工厂,再又各个工厂负责封装组合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值