龙空技术网

Java设计模式-简单工厂模式

小猪漫跑 55

前言:

目前大家对“java简单工厂模式应用场景”大约比较关心,你们都需要剖析一些“java简单工厂模式应用场景”的相关内容。那么小编同时在网摘上收集了一些有关“java简单工厂模式应用场景””的相关文章,希望同学们能喜欢,同学们快快来学习一下吧!

推荐阅读:Java设计模式-单例模式

什么是简单工厂模式

类的创建模式,又叫做静态工厂方法(Static Factory Metchod)模式。

由一个工厂对象决定创建出哪一种产品类的实例。

在工厂类中提供一个封装的静态工厂方法,用于隐藏对象初始化细节,使客户端代码可以专注于使用,而不用关心类的初始化过程。

工厂模式的几种形态简单工厂(Simple Factory)模式:又称静态工厂方法模式(Static Factory Methcod )模式。工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic Factory)模式。抽象工厂(Abstract Factory)模式:又称工具箱(Kit)模式。

简单工厂模式,是不同的工厂方法模式的一个特殊实现。

编程示例

比如说王者荣耀对战匹配,有多种匹配玩法。在这个游戏里面可以描述下列匹配类型:

一对一 Match1V1三对三 Match3V3五对五 Match5V5

我们有一个父类BaseMatch(抽象类),以及实现类 Match1V1,Match3V3,Match5V5

abstract  class BaseMatch {    protected final String tag;    public BaseMatch(String tag) {        this.tag = tag;    }    public abstract void match();}public class Match1V1 extends BaseMatch {    public Match1V1(String tag) {        super(tag);    }    @Override    public void match() {        System.out.println(tag+"-1V1匹配");    }}public class Match3V3 extends BaseMatch {    public Match3V3(String tag) {        super(tag);    }    @Override    public void match() {        System.out.println(tag+"-3V3匹配");    }}public class Match5V5 extends BaseMatch {    public Match5V5(String tag) {        super(tag);    }    @Override    public void match() {        System.out.println(tag+"-5V5匹配");    }}

实现一个静态方法create 用于封装工厂类 MatchFactory 创建 BaseMatch 具体的实现对象

public class MatchFactory {    public static BaseMatch create(int matchType) {        switch (matchType) {            case MatchConst.MATCH_1V1:                return new Match1V1(MatchConst.TAG_SIMPLE);            case MatchConst.MATCH_3V3:                return new Match3V3(MatchConst.TAG_SIMPLE);            case MatchConst.MATCH_5V5:                return new Match5V5(MatchConst.TAG_SIMPLE);            default:                throw new IllegalArgumentException("error match type:" + matchType);        }    }}

在客户端代码中通过工厂类创建不同类型 BaseMatch 对象实例

public class MatchFactory {    public static BaseMatch create(int matchType) {        switch (matchType) {            case MatchConst.MATCH_1V1:                return new Match1V1(MatchConst.TAG_SIMPLE);            case MatchConst.MATCH_3V3:                return new Match3V3(MatchConst.TAG_SIMPLE);            case MatchConst.MATCH_5V5:                return new Match5V5(MatchConst.TAG_SIMPLE);            default:                throw new IllegalArgumentException("error match type:" + matchType);        }    }}

输出结果:

简单工厂-1V1匹配简单工厂-3V3匹配简单工厂-5V5匹配
类图另外一种实现-枚举工厂

定义一个枚举抽象方法create 用于EnumMatchFactory 枚举创建 BaseMatch具体对象

public enum EnumMatchFactory {    MATCH_1V1() {        @Override        BaseMatch create() {            return new Match1V1(MatchConst.TAG_ENUM);        }    },    MATCH_3V3() {        @Override        BaseMatch create() {            return new Match3V3(MatchConst.TAG_ENUM);        }    },    MATCH_5V5() {        @Override        BaseMatch create() {            return new Match5V5(MatchConst.TAG_ENUM);        }    };    abstract BaseMatch create();}

在客户端代码中通过枚举工厂类创建不同类型 BaseMatch 对象实例

public class App {    public static  void main(String args[]){        EnumMatchFactory.MATCH_1V1.create().match();        EnumMatchFactory.MATCH_3V3.create().match();        EnumMatchFactory.MATCH_5V5.create().match();    }}

输出结果:

枚举工厂-1V1匹配枚举工厂-3V3匹配枚举工厂-5V5匹配
枚举工厂类图应用场景

创建对象时,不用关心对象是怎么创建和构成,工厂方法将实例化哪些对象以及如何实例化这些对象的细节隐藏起来。

优点可以把对象创建代码集中在一个地方。实现了职责划分,可以让代码更加低耦合(更好的可测试性、可读性、组件可替换性、可拓展性、隔离性等)。缺点会使代码变得比原来的更加复杂一些。使用静态方法作为工厂方法,无法被子类继承,工厂类型形成不了继承的等级结构现实案例java.util.Calendar#getInstance()java.util.ResourceBundle#getBundle()java.text.NumberFormat#getInstance()java.nio.charset.Charset#forName()java.net.URLStreamHandlerFactory#createURLStreamHandler(String) (Returns different singleton objects, depending on a protocol)java.util.EnumSet#of()javax.xml.bind.JAXBContext#createMarshaller() and other similar methods.

原文:简单工厂模式 | 码农大本营

标签: #java简单工厂模式应用场景