[SSM]GoF之工厂模式

目录

六、GoF之工厂模式

6.1工厂模式的三种形态

6.2简单工厂模式

6.3工厂方法模式

6.4抽象工厂模式(了解)


六、GoF之工厂模式

  • 设计模式:一种可以被重复利用的解决方案

  • GoF(Gang of Four),中文名------四人组。

  • 该书中描述了23种设计模式。我们平常所说的设计模式就是指这23种设计模式。

  • 除了这23种设计模式之外,还有其它的设计模式,比如:JavaEE的设计模式(DAO模式、MVC模式)

  • GoF23种设计模式可以分为三大类:

    • 创建型(5个):解决对象创建问题。

      • 单例模式

      • ⼯⼚⽅法模式

      • 抽象⼯⼚模式

      • 建造者模式

      • 原型模式

    • 结构型(7个):一些类或对象组合在一起的经典结构。

      • 代理模式

      • 装饰模式

      • 适配器模式

      • 组合模式

      • 享元模式

      • 外观模式

      • 桥接模式

    • 行为型(11个):解决类或对象之间的交互问题。

      • 策略模式

      • 模板⽅法模式

      • 责任链模式

      • 观察者模式

      • 迭代⼦模式

      • 命令模式

      • 备忘录模式

      • 状态模式

      • 访问者模式

      • 中介者模式

      • 解释器模式

6.1工厂模式的三种形态

  • 工厂模式通常有三种形态:

    • 第一种:简单工厂模式:不属于23种设计模式之一。简单工厂模式又叫做:静态工厂方法模式。简单工厂模式是工厂方法模式的一种特殊实现。

    • 第二种:工厂方法模式:是23种设计模式之一。

    • 第三种:抽象工厂模式:是23种设计模式之一。

6.2简单工厂模式

  • 简单工厂模式的角色包括三个:

    • 抽象产品角色

    • 具体产品角色

    • 工厂类角色

抽象产品角色

复制代码
package com.hhb.factory;
​
//抽象产品角色
public abstract class Weapon {
    //所有的武器都可以攻击
    public abstract void attack();
}

具体产品角色

复制代码
package com.hhb.factory;
​
//具体产品角色
public class Tank extends Weapon {
    @Override
    public void attack() {
        System.out.println("坦克");
    }
}

package com.hhb.factory;
​
//具体产品角色
public class Dagger extends Weapon {
    @Override
    public void attack() {
        System.out.println("匕首");
    }
}

工厂类角色

复制代码
package com.hhb.factory;
​
//工厂类角色
public class WeaponFactory {
    /**
     * 简单工厂模式种有一个静态方法,所以被称为:静态工厂方法模式。
     *
     * @param weaponType
     * @return
     */
    public static Weapon get(String weaponType) {
        if ("TANK".equals(weaponType)) {
            return new Tank();
        } else if ("DAGGER".equals(weaponType)) {
            return new Dagger();
        } else {
            throw new RuntimeException("不支持该武器的生产");
        }
    }
}

客户端

复制代码
package com.hhb.factory;
​
public class Test {
    public static void main(String[] args) {
        Weapon tank = WeaponFactory.get("TANK");
        tank.attack();
​
        Weapon dagger = WeaponFactory.get("DAGGER");
        dagger.attack();
​
        Weapon fighter = WeaponFactory.get("FIGHTER");
        fighter.attack();
    }
}
  • 简单工厂模式的优点:

    • 客户端程序不需要关系对象的创建细节,需要哪个对象时,只需向工厂索要即可,初步实现了责任的分离。客户端只负责消费,工厂负责生产,生产和消费分离。
  • 简单工厂模式的缺点:

    • 工厂类集中了所有产品的创造逻辑,形成了一个无所不知的全能类,也叫上帝类。显然工厂类非常关键,不能出现问题,一旦出现问题,整个系统瘫痪。

    • 不符合OCP开闭原则,在进行系统扩展时,需要修改工厂类。

6.3工厂方法模式

  • 工厂方法模式既保留了简单工厂模式的优点,同时又解决了简单工厂模式的缺点。

  • 工厂方法模式的角色包括:

    • 抽象工厂模式

    • 具体工厂模式

    • 抽象产品角色

    • 具体产品角色

抽象产品角色

复制代码
package com.hhb.method;
​
//抽象产品角色
public abstract class Weapon {
    public abstract void attack();
}

具体产品角色

复制代码
package com.hhb.method;
​
//具体产品角色
public class Gun extends Weapon {
    @Override
    public void attack() {
        System.out.println("枪");
    }
}

package com.hhb.method;
​
//具体产品角色
public class Dagger extends Weapon {
​
    @Override
    public void attack() {
        System.out.println("匕首");
    }
}

抽象工厂角色

复制代码
package com.hhb.method;
​
//抽象工厂角色
public abstract class WeaponFactory {
    public abstract Weapon get();
}

具体工厂角色

复制代码
package com.hhb.method;
​
//具体工厂角色
public class GunFactory extends WeaponFactory {
    @Override
    public Weapon get() {
        return new Gun();
    }
}

package com.hhb.method;
​
public class DaggerFactory extends WeaponFactory {
    @Override
    public Weapon get() {
        return new Dagger();
    }
}

客户端

复制代码
package com.hhb.method;
​
//客户端程序
public class Test {
    public static void main(String[] args) {
        WeaponFactory weaponFactory = new DaggerFactory();
        Weapon dagger = weaponFactory.get();
        dagger.attack();
​
        WeaponFactory weaponFactory1 = new GunFactory();
        Weapon gun = weaponFactory1.get();
        gun.attack();
    }
}
  • 工厂方法模式优点:

    • 一个调用者想创建一个对象,只要知道其名称就可以了。

    • 扩展性高,符号OCP原则,想要增加一个产品,只需要扩展一个工厂类就可以了。

    • 屏蔽产品的具体实现,调用者只关心产品的接口。

  • 工厂方法模式的缺点:

    • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了具体类的依赖,这并不是什么好事。

6.4抽象工厂模式(了解)

  • 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

  • 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在AbstractFactory里加代码,又要在具体的里面加代码。

相关推荐
C++业余爱好者4 分钟前
.NET线程池ThreadPool.QueueUserWorkItem
java·数据库·.net
.豆鲨包7 分钟前
【Android】Android内存缓存LruCache与DiskLruCache的使用及实现原理
android·java·缓存
superlls7 分钟前
(Java基础)集合框架继承体系
java·开发语言
宋哈哈12 分钟前
页面水印sdk源码
java·前端·javascript
你不是我我37 分钟前
【Java 开发日记】我们来说一下 Mybatis 的缓存机制
java·spring·mybatis
咪咪渝粮41 分钟前
112.路径总和
java·数据结构·算法
WKP941842 分钟前
原型设计模式
java·设计模式
笃行客从不躺平44 分钟前
SQL 注入复习
java·数据库·sql
小毅&Nora1 小时前
【后端】使用 Easy Rules 构建灵活的业务规则引擎 — Spring Boot 集成实践
java·spring boot·后端
多喝开水少熬夜1 小时前
算法-哈希表和相关练习-java
java·算法·散列表