栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式之工厂模式(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();
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931149.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号