一.模式定义
简单工厂模式也称为静态工厂模式。属于类创建型设计模式。实质是一个“工厂系统”可以产生出多种不同的”产品对象”,使用者不需要知道“”产品对象“”是怎么产生的,只需要知道关于该“产品对象”的关键参数,将该参数传给“工厂系统”就可以由工厂系统生产出对应的产品。
二.模式要素
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)客户端只知道传入工厂类的参数,对于如何创建对象不关心。