设计模式-创建型模式-工厂模式

1.概述

        工厂模式提供了一种创建对象的最佳方式,在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象;

        工厂模式分为三种:简单工厂、工厂方法和抽象工厂;

【案例】

        新用户注册立即参与抽奖活动 ,奖品的种类有:打折券,免费优酷会员,小礼品;

        下面不同工厂模式的实现都根据案例来;

2.简单工厂模式

        又叫静态工厂方法模式,算是工厂方法模式的一个特例,通过静态方法接收不同而参数来返回不同的实例对象;

2.1 实现方式

        定义一个工厂类,根据不同参数返回不同实例;

  • 抽象产品:定义了产品的规范,描述了产品的主要特性和功能;
  • 具体产品:实现或者继承抽象产品的子类;
  • 具体工厂:提供了创建产品的方法,调用者通过该方法来获取产品;

2.2 优缺点

优点:

        封装了创建对象的过程,可以通过参数直接获取对象,把对象的创建和业务逻辑层分开,这样避免了以后修改客户代码,如果要实现新产品直接修改工厂类,不需要在原代码中改,降低了客户代码修改的可能性,更易于扩展;

缺点: 

        增加新产品时还是需要修改工厂类的代码,违背了开闭原则;

3.工厂方法模式

        定义一个用于创建对象的接口,让子类决定实例化那个产品类对象,工厂方法使一个产品类的实例化延迟到其他工厂的子类;

3.1 实现方式

        封装对象创建的过程,提升创建对象方法的可复用性;

  • 抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品;
  • 具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建;
  • 抽象产品:定义了产品的规范,描述了产品的主要特性和功能;
  • 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应;

3.2 优缺点

优点:

        用户只需要知道具体工厂的名称就可得到所要的产品,无需知道产品的具体创建过程;

        在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

缺点:

        每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,增加了系统复杂度;

4.抽象工厂模式

        抽象工厂模式比工厂方法模式的抽象程度更高,抽象工厂模式中一个具体工厂可以生产一组相关的具体产品,这样一组产品称为产品族,产品族中的每一个产品都分属于某个产品继承等级结构;

  • 产品等级结构:如一个抽象类电脑,其子类有联想、苹果、华硕等,电脑与不同品牌电脑之间就构成了一个产品等级结构(同一类产品的不同品牌);
  • 产品族:产品族是指由同一个工厂生产,位于不同产品等级结构中的一组产品,如苹果手机、苹果电脑、苹果手表就是一个产品族(一个品牌的不同类产品);

4.1 实现方式 

        抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类;抽象工厂模式中的具体工厂不只是创建一种产品,而是负责创建一个产品族;

  • 抽象工厂:声明一种用于创建一族产品的方法,每个方法对应一种产品;
  • 具体工厂:实现抽象工厂中的多个抽象方法,完成具体产品的创建;
  • 抽象产品:定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品;
  • 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系;

4.2 优缺点

优点:

        对于不同产品系列有较多共同特性时,可以使用抽象工厂模式,有助于提升组件的复用性;(JDBC的实现就用到了抽象工厂模式)

        当需要提升代码的扩展性并降低维护成本时,把对象的创建和使用过程分开,能有效的将代码统一到一个级别上;(日志)

        解决跨平台带来的兼容性问题,后台尽可能的使用更高级的统一的抽象功能;

缺点:

        增加新的产品等级结构麻烦,需要对原有结构进行较大的修改,甚至需要修改抽象层代码,违背了开闭原则;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值