设计模式之工厂模式(Factory)

三种工厂模式的区别

模式说明
简单工厂用来生产同一等级结构中的任意产品。
(对于增加新的产品,需要修改已有代码)
工厂方法用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂用来生产不同产品族的全部产品。
(对于增加新的产品,无能为力;支持增加产品族)

适用场景 

  • 当一个类不知道它所必须创建的对象的类的时候

  • 当一个类希望由它的子类来指定它所创建的对象的时候

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();
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值