细说工厂模式之抽象工厂模式(三)

时间:2021-06-22 21:16:15

前面两篇文章分别介绍了简单工厂模式跟一般工厂模式,本篇文章将继续介绍工厂模式中的终极模式-抽象工厂模式

细说工厂模式之简单工厂模式(一)

细说工厂模式之一般工厂模式(二)

在一般工厂中我们可以看到可以用乐视电视工厂来生产乐视电视,小米工厂来生产小米电视。已经很好的实现了开闭原则。但是相比较而言,偌大的工厂就只安装电视生产线,是不是有点大材小用了。咱们看看富士康的工厂可以干吗,既可以为苹果生产手机,也可以为它生产Ipad,没准将来苹果汽车出来了还可以为它代工汽车呢。所以在一个工厂中,咱们可以把一类产品当成一条生产线,以乐视工厂为例,它不光可以生产乐视超级电视,也可以生产乐视超级手机,电视跟手机分别作为其工厂的两条生产线就行了。在咱们的设计模式中,就可以把这一模式很好的借鉴过来。


细说工厂模式之抽象工厂模式(三)

从上面的实例类图中可以看到,相比一般工厂模式,咱们增加了手机这条生产线。他们还是有他们各自的工厂来生产,也就是,小米的手机跟电视由小米工厂来实现。同理,海信的工厂可以生产海信电视跟海信手机(咱们姑且就认为海信也有手机吧)。其实,将来如果乐视跟小米造汽车的话,我们可以很方便的再添加一个汽车家族,然后还是通过他们家的工厂来生产。咱们接下来来看看他们怎么通过Java来实现哈。

ITV抽象类跟前面两篇文章中是一样的,为了方便阅读,我还是把它贴了上来。

package com.weiyu.factory;

/**
 * Created by Sam on 7/14/2016.
 *
 * 这里是一个抽象类,这里有获取价格以及生产过程这两个抽象方法
 */
public abstract class ITV {
    /**
     * price方法定义每台电视的售价,具体的售价由其子类来实现
     */
    public abstract void price();

    /**
     * 描述了每台电视的生产过程,具体的生产过程由其子类实现
     */
    public abstract void produceProcess();
}

抽象的父类中有priceproduceProcess两个方法,分别用来定义每台电视的价格以及电视的生产过程。接着咱们分别来写他的三个子类。

LeTV

package com.weiyu.factory;

/**
 * Created by Sam on 7/14/2016.
 */
public class LeTV extends ITV {
    @Override
    public void price() {
        System.out.println("乐视超级电视每台售价5000元");
    }

    @Override
    public void produceProcess() {
        System.out.println("乐视电视生产过程由部分国产代工厂以及富士康代工");
    }
}

MiTV

package com.weiyu.factory;

/**
 * Created by Sam on 7/14/2016.
 */
public class MiTV extends ITV {
    @Override
    public void price() {
        System.out.println("小米电视每台售价4999元");
    }

    @Override
    public void produceProcess() {
        System.out.println("小米电视的生产由富士康代工");
    }
}

HisenseTV

package com.weiyu.factory;

/**
 * Created by Sam on 7/14/2016.
 */
public class HisenseTV extends ITV {
    @Override
    public void price() {
        System.out.println("海信电视每台售价10000元");
    }

    @Override
    public void produceProcess() {
        System.out.println("海信电视由自家工厂生产");
    }
}

咱们接着来添加手机这个大家族的类了。

首先,我们新建一个抽象的手机父类IMobilePhone

package com.weiyu.abstractfactory;

/**
 * Created by Sam on 7/14/2016.
 */
public abstract class IMobilePhone {
    /**
     * price方法定义每台手机的售价,具体的售价由其子类来实现
     */
    public abstract void price();

    /**
     * 描述了每台手机的生产过程,具体的生产过程由其子类实现
     */
    public abstract void produceProcess();
}

接着我们分别新建乐视手机,小米手机以及海信手机类来继承他们的父类,并重新父类里的两个方法。

package com.weiyu.abstractfactory;

/**
 * Created by Sam on 7/14/2016.
 */
public class LePhone extends IMobilePhone {
    @Override
    public void price() {
        System.out.println("每台乐视手机卖1099元");
    }

    @Override
    public void produceProcess() {
        System.out.println("乐视手机由国内代工厂代工");
    }
}

MiPhone

package com.weiyu.abstractfactory;

/**
 * Created by Sam on 7/14/2016.
 */
public class MiPhone extends IMobilePhone {
    @Override
    public void price() {
        System.out.println("每台小米手机卖1999元");
    }

    @Override
    public void produceProcess() {
        System.out.println("小米手机富士康代工");
    }
}

HisensePhone

package com.weiyu.abstractfactory;

/**
 * Created by Sam on 7/14/2016.
 */
public class HisensePhone extends IMobilePhone {
    @Override
    public void price() {
        System.out.println("每台海信手机卖1699元");
    }

    @Override
    public void produceProcess() {
        System.out.println("海信手机由自家生产线代工");
    }
}

咱们接着来看一下IFactory这个抽象的工厂父类,这次咱们不光要生产电视,还要生产手机了,所以咱们要添加一个生产手机的方法。

package com.weiyu.abstractfactory;

/**
 * Created by Sam on 7/14/2016.
 */
public abstract class IFactory {

    /**
     * 该方法可以通过相应的子类来生产相应的电视
     * @return: 返回相应的电视类
     */
    public abstract ITV createTV();

    /**
     * 可以由子类来生产相应的手机
     * @return: 返回相应的手机类
     */
    public abstract IMobilePhone createPhone();
}

再来看一下这个抽象工厂父类的三个子类。

LeFactory

package com.weiyu.abstractfactory;

/**
 * Created by Sam on 7/14/2016.
 */
public class LeFactory extends IFactory {
    @Override
    public ITV createTV() {
        return new LeTV();
    }

    @Override
    public IMobilePhone createPhone() {
        return new LePhone();
    }
}

MiFactory

package com.weiyu.abstractfactory;

/**
 * Created by Sam on 7/14/2016.
 */
public class MiFactory extends IFactory {
    @Override
    public ITV createTV() {
        return new MiTV();
    }

    @Override
    public IMobilePhone createPhone() {
        return new MiPhone();
    }
}

HisenseFactory

package com.weiyu.abstractfactory;

/**
 * Created by Sam on 7/14/2016.
 */
public class HisenseFactory extends IFactory {
    @Override
    public ITV createTV() {
        return new HisenseTV();
    }

    @Override
    public IMobilePhone createPhone() {
        return new HisensePhone();
    }
}

最后咱们再来看看Client类中来调用各家工厂生产电视跟手机的方法。

package com.weiyu.abstractfactory;

/**
 * Created by Sam on 7/14/2016.
 */
public class Client {
    public static void main(String[] args){
        IFactory leFactory = new LeFactory();
        IFactory miFactory = new MiFactory();
        IFactory hisenseFactory = new HisenseFactory();

        System.out.println("-------------生产电视-------------------------");
        ITV letv = leFactory.createTV();
        ITV mi = miFactory.createTV();
        ITV hisense = hisenseFactory.createTV();

        System.out.println("-------------电视生产过程-------------------------");
        //获取三个电视的生产过程
        letv.produceProcess();
        mi.produceProcess();
        hisense.produceProcess();

        System.out.println("-------------各家电视售价-------------------------");
        //获取三台电视的售价
        letv.price();
        mi.price();
        hisense.price();


        System.out.println("-------------生产手机-------------------------");
        IMobilePhone lePhone = leFactory.createPhone();
        IMobilePhone miPhone = miFactory.createPhone();
        IMobilePhone hisensePhone = hisenseFactory.createPhone();


        System.out.println("-------------各家手机生产过程-------------------------");
        lePhone.produceProcess();
        miPhone.produceProcess();
        hisensePhone.produceProcess();


        System.out.println("-------------各家手机售价-------------------------");
        lePhone.price();
        miPhone.price();
        hisensePhone.price();

    }
}

从该类可以看出,乐视的工厂类不光可以生产乐视电视,还可以生产乐视手机。然后我们可以分别调用其各自的方法来查看生产过程以及每台手机或者电视的售价。

细说工厂模式之抽象工厂模式(三)

至此,咱们的工厂方法基本上就全部介绍完了。希望能对大家有帮助。(PS,给乐视跟小米做了这么多广告,难道不该给点钱吗?哈哈)