大话设计模式一:简单工厂模式

一.模式定义

简单工厂模式也称为静态工厂模式。属于类创建型设计模式。实质是一个“工厂系统”可以产生出多种不同的”产品对象”,使用者不需要知道“”产品对象“”是怎么产生的,只需要知道关于该“产品对象”的关键参数,将该参数传给“工厂系统”就可以由工厂系统生产出对应的产品。

二.模式要素

1.具体工厂:简单工厂模式的核心,负责实现创建所有具体产品类的实例。工厂类可以被外界直接调用来创建所需的产品对象。

2.抽象产品:是所有具体产品的父类,负责描述所有实例所共有的公共接口。

3.具体产品:继承自抽象产品角色,一般为多个,是简单工厂模式的创建目标。工厂类返回的都是该角色的某一具体产品。

4.使用者:场景的应用者。

三.举例说明

我们以王者荣耀的场景进行说明,想象有一个英雄工厂专门用来生产各种职业的英雄。英雄有坦克、战士、刺客、法师、射手、辅助6种职业。则英雄产生的过程见下图。

       

四.代码实现

工程结构如下:

1.抽象英雄:IHero.java

package simpleFactory;

/**
 * @program: DesignModes
 * @description:英雄抽象类
 * @author: Lei Dong
 * @create: 2018-09-02 09:45
 **/
public interface IHero {
    public void showDesc();
}

2.坦克:Tank.java

package simpleFactory;

/**
 * @program: DesignModes
 * @description: 坦克英雄
 * @author: Lei Dong
 * @create: 2018-09-02 09:47
 **/
public class Tank implements IHero {
    @Override
    public void showDesc() {
        System.out.println("我是一名坦克");
    }
}

3.战士:Warrior.java

package simpleFactory;

/**
 * @program: DesignModes
 * @description:战士英雄
 * @author: Lei Dong
 * @create: 2018-09-02 09:48
 **/
public class Warrior implements IHero {
    @Override
    public void showDesc() {
        System.out.println("我是一名战士");
    }
}

4.刺客:Assassinator.java

package simpleFactory;

/**
 * @program: DesignModes
 * @description:刺客英雄
 * @author: Lei Dong
 * @create: 2018-09-02 09:49
 **/
public class Assassinator implements IHero {
    @Override
    public void showDesc() {
        System.out.println("我是一名刺客");
    }
}

5.射手:Shooter.java

package simpleFactory;

/**
 * @program: DesignModes
 * @description:射手英雄
 * @author: Lei Dong
 * @create: 2018-09-02 09:49
 **/
public class Shooter implements IHero {
    @Override
    public void showDesc() {
        System.out.println("我是一名射手");
    }
}

6.法师:Mage.java

package simpleFactory;

/**
 * @program: DesignModes
 * @description:法师英雄
 * @author: Lei Dong
 * @create: 2018-09-02 09:50
 **/
public class Mage implements IHero {
    @Override
    public void showDesc() {
        System.out.println("我是一名法师");
    }
}

7.辅助:Assistant.java

package simpleFactory;

/**
 * @program: DesignModes
 * @description:辅助英雄
 * @author: Lei Dong
 * @create: 2018-09-02 10:18
 **/
public class Assistant implements IHero {
    @Override
    public void showDesc() {
        System.out.println("我是一名辅助");
    }
}

8.英雄工厂:HeroFactory.java

package simpleFactory;

/**
 * @program: DesignModes
 * @description: 英雄工厂
 * @author: Lei Dong
 * @create: 2018-09-02 09:40
 **/
public class HeroFactory {
    public IHero createHero(String style) {
        IHero hero = null;
        switch (style) {
            case "tank":
                hero = new Tank();
                break;
            case "warrior":
                hero = new Warrior();
                break;
            case "assassinator":
                hero = new Assassinator();
                break;
            case "shooter":
                hero = new Shooter();
                break;
            case "mage":
                hero = new Mage();
                break;
            case "assistant":
                hero = new Assistant();
                break;
            default:
                break;
        }
        return hero;
    }
}

9.使用者:Main.java

package simpleFactory;

/**
 * @program: DesignModes
 * @description: Main
 * @author: Lei Dong
 * @create: 2018-09-02 09:39
 **/
public class Main {
    public static void main(String[] args) {
        HeroFactory heroFactory = new HeroFactory();
        IHero hero = heroFactory.createHero("shooter");
        hero.showDesc();
    }
}

运行结果:

五.总结

1.简单工厂模式的优点

(1)使用者不需要直接创建产品,而是直接消费产品。使得产品的创建和使用解耦。

(2)使用者通过参数就可以创建产品。

2.简单工厂模式的缺点

(1)工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
(2)使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
(3)添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
(4)简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

3.简单工厂模式的适用环境
(1)工厂类负责创建的对象比较少,不会造成工厂方法中的业务逻辑太过复杂。
(2)客户端只知道传入工厂类的参数,对于如何创建对象不关心。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值