1.  设计模式:  40

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

● GoF(Gang of Four),中文名——四人组。

● 《Design Patterns: Elements of Reusable Object-Oriented Software》(即《设计模式》一书),1995年由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著。这几位作者常被称为"四人组(Gang of Four)"。

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

● 不过除了GoF23种设计模式之外,还有其它的设计模式,比如:JavaEE的设计模式(DAO模式、MVC模式等)。

2. GoF23种设计模式可分为三大类:40

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

    ■ 单例模式

    ■ 工厂方法模式

    ■ 抽象工厂模式

    ■ 建造者模式

    ■ 原型模式

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

    ■ 代理模式

    ■ 装饰模式

    ■ 适配器模式

    ■ 组合模式

    ■ 享元模式

    ■ 外观模式

    ■ 桥接模式

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

    ■ 策略模式

    ■ 模板方法模式

    ■ 责任链模式

    ■ 观察者模式

    ■ 迭代子模式

    ■ 命令模式

    ■ 备忘录模式

    ■ 状态模式

    ■ 访问者模式

    ■ 中介者模式

    ■ 解释器模式

● 工厂模式是解决对象创建问题的,所以工厂模式属于创建型设计模式。这里为什么学习工厂模式呢?这是因为Spring框架底层使用了大量的工厂模式。

3. 工厂模式的三种形态  40

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

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

● 第二种:工厂方法模式(Factory Method):是23种设计模式之一。

● 第三种:抽象工厂模式(Abstract Factory):是23种设计模式之一。

4. 简单工厂模式  40

1. 简单工厂模式是工厂方法模式的一种特殊实现,又被称为:静态工厂方法模式。

4.1  简单工厂模式解决什么问题呢?  41

    优点:客户端程序不需要关心对象的创建细节,需要哪个对象时,只需要向工厂索要即可,初步实现了责任的分离。

        客户端只负责“消费”,工厂负责“生产”。生产和消费分离。

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

● 抽象产品 角色

● 具体产品 角色

● 工厂类 角色

简单工厂模式的代码如下:

抽象产品角色:com.powernode.simple.factory

抽象类Weapon

package com.powernode.simple.factory;

//抽象类
//抽象产品角色  41
public abstract class Weapon {

    /**
     * 所有的武器都可以攻击。
     */
    public abstract void attack();

}

 具体产品 角色com.powernode.simple.factory

Tank

package com.powernode.simple.factory;

/**
 * 具体产品角色  41
 **/
public class Tank extends Weapon{
    @Override
    public void attack() {
        System.out.println("坦克开炮!!!");
    }
}

Fighter

package com.powernode.simple.factory;

/**
 * 具体产品角色  41
 **/
public class Fighter extends Weapon{
    @Override
    public void attack() {
        System.out.println("战斗机抛下小男孩!!!!");
    }
}

Dagger

package com.powernode.simple.factory;

/**
 * 具体产品角色  41
 **/
public class Dagger extends Weapon{
    @Override
    public void attack() {
        System.out.println("砍丫的!!!");
    }
}

工厂类 角色com.powernode.simple.factory

WeaponFactory

package com.powernode.simple.factory;

/**
 * 工厂类角色  41
 **/
public class WeaponFactory {

    /**
     * 静态方法。要获取什么产品?就看你传什么参数,传TANK获取坦克,传DAGGER获取匕首,传FIGHTER获取战斗机
     * 简单工厂模式中有一个静态方法,所以被称为:静态工厂方法模式。
     * @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 if ("FIGHTER".equals(weaponType)) {
            return new Fighter();
        } else {
            throw new RuntimeException("不支持该武器的生产");
        }
    }

}

测试com.powernode.simple.factory

Test

package com.powernode.simple.factory;

/**
 * 这是客户端程序 测试的41
 **/
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();
    }
}


GoF工厂模式之简单工厂模式_设计模式

4.3  简单工厂模式的缺点?  41

    缺点一:假设现在需要扩展一个新的产品,WeaponFactory工厂类的代码是需要修改的,显然违背了OCP原则。

    缺点二:工厂类的责任比较重大,不能出现任何问题,因为这个工厂类负责所有产品的生产,称为全能类,或者有人把它叫做上帝类。

        这个工厂类一旦出问题,整个系统必然全部瘫痪。(不要把所有鸡蛋放到一个篮子里面哦。)