简单工厂

大概工厂又叫做静态工厂方法(static factory method)方式,简单工厂是由叁个工厂来支配创办出哪种个人的实现,在不菲的座谈中,轻松工厂做为工厂方法方式(Factory Method)的八个独特案例现身.

其一形式封装的变化点是如何?

那是每二个形式都应该思虑的大旨难题,必定要记得,假诺系统中这么些点不会转变,是没供给来封装的,不然会产生方式误用.轻易工厂是化解因为多少个子类的实例动态创制的标题,变化点也正是:具体的创导实例不分明.

开始的一段时代状态

既然是指标创立情势,当然消除的是目标成立时的耦合,不是具备的创造对象都以耦合的,大家需求商量思量,比如:String str = new String("abc");如此那般的代码,在系统中是不会扭转的,大概改动频率非常的低,不必封装.而小编辈的作业对象举个例子一个游玩场景中的道路(Road)希望在运行中精选不一样风格的征途,举例有泥泞道路(WaterRoad),雪地道路(SnowRoad),未来还也可能有望引进种种差异道路,那么大家的前期调用处(Client)代码大概是如此的:

if( roadType.equals("water") )
{
    WaterRoad wroad = new WaterRoad() ;
    //...
}
else if( roadType.equals("snow"))
{
    SnowRoad sroad = new SnowRoad() ;
    //...
}

此刻一旦要参预新的XXRoad风格对象,大家必要充实多少个XXRoad类,然后在调用处(Clinet)代码中期维修改,增添else if( roadType.eqals("xxroad"))如此的代码.违反了设计方式中的开闭原则(对扩张开放,对修改关闭),大家利用了破坏性的点子来修改这段代码,导致了调用处代码的修改与重新编写翻译.

第一步封装

固守重构的思路,我们上面包车型大巴代码,因为违反了开闭原则,大家愿意在退换代码时不用去修改Client代码,在这大家引进注重倒置标准来消除那个难点.

先来拜候大家最近的依赖关系,高层模块信任着低层模块,Client代码正是高层模块,它一贯调用着WaterRoad,SnowRoad等目的,那样当对象有变化时,自然是会潜移默化到Client代码.正视倒置是指,在高层模块与低层模块中进入一层抽象层,两层代码都依附了用空想来欺骗别人层.那样当实际项目须求修改时,不会影响到Client.

化解办法

在地点的例证中,引进Road接口,来陈述道路的一块行为,将WaterRoad与SnowRoad完结Road接口.那样一来,调用处的代码就改成了

    Road road = null ;

    if( roadType.equals("water") )
    {
        road = new WaterRoad() ;
        //...
    }
    else if( roadType.equals("snow"))
    {
        road = new SnowRoad() ;
        //...
    }

装进了如何?

迄今大家做到了第一步封装,将目的的表现抽象为接口,将扭转的分化类型的是现封装到了落到实处类中.可是Client中的代码依旧在if else剖断,假设插手新的类型,依旧亟待修改Client,接下去我们缓慢解决第二步封装.

第二步封装

位置提到的标题是要消除Client中的if else推断,我们推荐SimpleFactory来封装那个动态判别的进程.
图片 1

/**
 * 道路接口
 *
 * @author aladdinty
 * @create 2017-12-29 
 **/
public interface Road
{
}


/**
 * @author aladdinty
 * @create 2017-12-29 
 **/
public class SnowRoad implements Road
{
}

/**
 * @author aladdinty
 * @create 2017-12-29 
 **/
public class WaterRoad implements Road
{
}

/**
 * 最简单的工厂模式
 *
 * @author aladdinty
 * @create 2017-12-29 
 **/
public class SimpleFactory
{
    public static Road createObject(String roadType)
    {
        if( roadType.equals ( "water"))
        {
            return new WaterRoad () ;
        }
        else if( roadType.equals ("snow"))
        {
            return new SnowRoad () ;
        }
        else
        {
            return null ;
        }
    }

    public static void main( String[] args )
    {
        Object obj = SimpleFactory.createObject ("water") ;
    }
}

到近日截止,轻巧工厂情势就成功了,解决了切实创设的目的类型不明确,当扩展新的现实贯彻时,大家得以扩展类的情势来达成,不必修改调用处(Client),当然Factory还索要修改if else代码,那几个标题得以用过后的工厂方法方式来缓慢解决,或然利用反射本领. 工厂方法情势是特意为了化解factory中的变化而生,反射是将字符串推断消食掉.

本文由金沙电玩城捕鱼发布于www.3015.com,转载请注明出处:简单工厂

您可能还会对下面的文章感兴趣: