三种工厂模式的区别
模式 | 说明 |
---|---|
简单工厂 | 用来生产同一等级结构中的任意产品。 (对于增加新的产品,需要修改已有代码) |
工厂方法 | 用来生产同一等级结构中的固定产品。(支持增加任意产品) |
抽象工厂 | 用来生产不同产品族的全部产品。 (对于增加新的产品,无能为力;支持增加产品族) |
适用场景
-
当一个类不知道它所必须创建的对象的类的时候
-
当一个类希望由它的子类来指定它所创建的对象的时候
1.简单工厂模式(又称静态工厂模式)
接口定义
public interface Game {
void run();
}
Game实现类CF
public class CF implements Game{
@Override
public void run() {
System.out.println("启动穿越火线");
}
}
Game实现类LOL
public class LOL implements Game{
@Override
public void run() {
System.out.println("启动英雄联盟");
}
}
简单工厂类
public class GameFactory {
public static Game createGame(String type){
if(type.equals("CF")){
return new CF();
}else if(type.equals("LOL")){
return new LOL();
}else{
return null;
}
}
}
测试
public class Test {
public static void main(String[] args) {
Game cf = GameFactory.createGame("CF");
Game lol = GameFactory.createGame("LOL");
cf.run();
lol.run();
}
}
小结:
- 简单工厂模式也叫静态工厂模式,就是工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
- 对于增加新产品无能为力!不修改代码的话,是无法扩展的。
2.工厂方法模式
接口定义
public interface Game {
void run();
}
Game实现类CF
public class CF implements Game{
@Override
public void run() {
System.out.println("启动穿越火线");
}
}
Game实现类LOL
public class LOL implements Game{
@Override
public void run() {
System.out.println("启动英雄联盟");
}
}
工厂接口
public interface GameFactory {
Game createGame();
}
每个Game实现类对应创建一个工厂类
public class CFFactory implements GameFactory{
@Override
public Game createGame() {
return new CF();
}
}
public class LOLFactory implements GameFactory{
@Override
public Game createGame() {
return new LOL();
}
}
测试
public class Test {
public static void main(String[] args) {
Game cf = new CFFactory().createGame();
Game lol = new LOLFactory().createGame();
cf.run();
lol.run();
}
}
小结:
结构复杂度
从这个角度比较,显然简单工厂模式要占优。简单工厂模式只需一个工厂类,而工厂方法模式的工厂类随着产品类个数增加而增加,这无疑会使类的个数越来越多,从而增加了结构的复杂程度。
代码复杂度
代码复杂度和结构复杂度是一对矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方面肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。
3.抽象工厂模式
3.1 PC游戏
PCGame接口定义
public interface PCGame {
void run();
}
PCGame实现类CF
public class CF implements PCGame {
@Override
public void run() {
System.out.println("启动穿越火线");
}
}
PCGame实现类LOL
public class LOL implements PCGame {
@Override
public void run() {
System.out.println("启动英雄联盟");
}
}
3.2 手机游戏
MobileGame接口定义
public interface MobileGame {
void run();
}
MobileGame实现类WangZheRongYao
public class WangZheRongYao implements MobileGame{
@Override
public void run() {
System.out.println("启动王者荣耀");
}
}
MobileGame实现类HePingJingYing
public class HePingJingYing implements MobileGame{
@Override
public void run() {
System.out.println("启动和平精英");
}
}
3.3 抽象工厂
public abstract class AbstractFactory {
public abstract PCGame getPCGame(String game);
public abstract MobileGame getMobileGame(String game);
}
3.4 两个游戏工厂
public class PCGameFactory extends AbstractFactory{
@Override
public PCGame getPCGame(String game) {
if(game.equals("CF")){
return new CF();
}else if(game.equals("LOL")){
return new LOL();
}else{
return null;
}
}
@Override
public MobileGame getMobileGame(String game) {
return null;
}
}
public class MobileGameFactory extends AbstractFactory{
@Override
public PCGame getPCGame(String game) {
return null;
}
@Override
public MobileGame getMobileGame(String game) {
if(game.equals("王者荣耀")){
return new WangZheRongYao();
}else if(game.equals("和平精英")){
return new HePingJingYing();
}else{
return null;
}
}
}
3.5 生产工厂类 FactoryProducer
public class FactoryProducer {
public static AbstractFactory getFactory(String type){
if(type.equals("端游")){
return new PCGameFactory();
}else if(type.equals("手游")){
return new MobileGameFactory();
}else{
return null;
}
}
}
3.6 测试
public class Test {
public static void main(String[] args) {
AbstractFactory pcGameFactory = FactoryProducer.getFactory("端游");
PCGame cf = pcGameFactory.getPCGame("CF");
cf.run();
AbstractFactory mobileGameFactory = FactoryProducer.getFactory("手游");
MobileGame wangzherongyao = mobileGameFactory.getMobileGame("王者荣耀");
wangzherongyao.run();
}
}