设计模式3-抽象工厂模式

来源:互联网 发布:c语言utf8转unicode 编辑:程序博客网 时间:2024/06/07 19:14

          假如现在女蜗还需要生产男性和女性,使用抽象工厂模式,类图如下:



定义人种接口:

package com.jack.abstractfactory;/** * Created by jack on 2017/8/1. * 人类接口 */public interface Human {    /**     * 每个人种的皮肤都有相应的颜色     */    void getColor();    /**     * 人会说话交谈     */    void talk();    /**     * 人是有性别的,获取人的性别     */    void getSex();}

人种有三个抽象类,负责人种的抽象属性定义:肤色和语言。白色,黑色,黄色人种,代码如下:

package com.jack.abstractfactory;/** * Created by jack on 2017/8/1. * 黑色人种抽象类 */public abstract class AbstractBlackHuman implements Human{    @Override    public void getColor() {        System.out.println("黑色人种的皮肤是黑色的");    }    @Override    public void talk() {        System.out.println("黑色人种说黑话");    }}


package com.jack.abstractfactory;/** * Created by jack on 2017/8/1. * 白色人种抽象类 */public abstract class AbstractWhiteHuman implements Human{    @Override    public void getColor() {        System.out.println("白色人种的皮肤是白色的");    }    @Override    public void talk() {        System.out.println("白色人种一般说英语");    }}

package com.jack.abstractfactory;/** * Created by jack on 2017/8/1. * 黄色人种抽象类 */public abstract class AbstractYellowHuman implements Human{    @Override    public void getColor() {        System.out.println("黄色人种的皮肤是黄色的");    }    @Override    public void talk() {        System.out.println("黄色人种都说普通话");    }}


    每个抽象类都有两个实现类,分别实现公共的最细节,最具体的事务:肤色和语言。具体的实现类实现肤色,性别定义,以黄色女性人种为例,代码如下:

package com.jack.abstractfactory;/** * Created by jack on 2017/8/1. * 黄人女性 */public class FemaleYellowHuman extends AbstractYellowHuman{    @Override    public void getSex() {        System.out.println("黄人女性");    }}


package com.jack.abstractfactory;/** * Created by jack on 2017/8/1. * 黄人男性 */public class MaleYellowHuman extends AbstractYellowHuman{    @Override    public void getSex() {        System.out.println("黄人男性");    }}


     其他的黑色人种,白色人种和上面的男性和女性的代码类似,不在贴代码,具体的参考:https://github.com/wj903829182/springboot/tree/master/designpattern


     到这里,就已经把真实的人种都定义出来了,下面看看怎么进行制造。


定义造人的接口:

package com.jack.abstractfactory;/** * Created by jack on 2017/8/1. * 人类生产接口类 */public interface HumanFactory {    //制造黄色人种    Human createYellowHuman();    //制造黑色人种    Human createBlackHuman();    //制造白色人种    Human createWhiteHuman();}


  女性生产人实现类:

package com.jack.abstractfactory;/** * Created by jack on 2017/8/1. * 女性工厂类 */public class FemaleFactory implements HumanFactory{    /**     * 生产出黄人女性     * @return     */    @Override    public Human createYellowHuman() {        return new FemaleYellowHuman();    }    /**     * 生产出黑人女性     * @return     */    @Override    public Human createBlackHuman() {        return new FemaleBlackHuman();    }    /**     * 生产出白人女性     * @return     */    @Override    public Human createWhiteHuman() {        return new FemaleWhiteHuman();    }}


男性生产实现类:

package com.jack.abstractfactory;/** * Created by jack on 2017/8/1. * 男性生产类 */public class MaleFactory implements HumanFactory{    /**     * 生产出黄人男性     * @return     */    @Override    public Human createYellowHuman() {        return new MaleYellowHuman();    }    /**     * 生产出黑人男性     * @return     */    @Override    public Human createBlackHuman() {        return new MaleBlackHuman();    }    /**     * 生产出白人男性     * @return     */    @Override    public Human createWhiteHuman() {        return new MaleWhiteHuman();    }}


   设施已经齐全了,下面看看女娲怎么造人,测试代码如下:

package com.jack.abstractfactory;/** * Created by jack on 2017/8/1. */public class NvWaB {    public static void main(String[] args) {        //第一条生产线,男性生产线        HumanFactory maleHumanFactory = new MaleFactory();        //第二条生产线,女性生产线        HumanFactory femaleHumanFactory = new FemaleFactory();        //生产线建立完成,开始进行生产        Human maleYellowHuman = maleHumanFactory.createYellowHuman();        Human femaleYellowHuman = femaleHumanFactory.createYellowHuman();        System.out.println("生产一个黄色女性 : ");        femaleYellowHuman.getSex();        femaleYellowHuman.getColor();        femaleYellowHuman.talk();        System.out.println("\n生产一个黄色男性 : ");        maleYellowHuman.getSex();        maleYellowHuman.getColor();        maleYellowHuman.talk();    }}


   运行程序,输出如下:

生产一个黄色女性 : 黄人女性黄色人种的皮肤是黄色的黄色人种都说普通话生产一个黄色男性 : 黄人男性黄色人种的皮肤是黄色的黄色人种都说普通话


抽象工厂模式的优点:

 1,封装性,每个产品的实现类不是高层模块关心的,关心的是接口,是抽象。

  2,产品族类的约束为非公开状态。


缺点:

   1,产品族扩展非常困难



原创粉丝点击