zoukankan      html  css  js  c++  java
  • 工厂设计模式

    这周在看代码时,看到别人的代码里用到了工厂设计模式,做为小白,所以来学习下。

    我们首先来看一个例子,是女娲造人的例子,女娲需要造黑色、黄色和白色三种人。并且每种人分为男性和女性。

    这个例子中就可以用到工厂设计模式。具体的类图如下:

    接下来,我们来看看相关的实现,Human接口代码清单如下:

    public interface Human {
    //每个人都应该有相应的颜色
    public void getColor();
    //人类会说话
    public void talk();
    //每个人都有性别
    public void getSex();
    }

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

    //白色人种
    public abstract class AbstractWhiteHuman implements Human{

    @Override
    public void getColor() {
    System.out.println("白色人种的皮肤颜色是白色的");
    }

    @Override
    public void talk() {
    System.out.println("白色人种会说话,一般说的都是单字节");
    }
    }
    //黑色人种
    public abstract class AbstractBlackHuman implements Human{

    @Override
    public void getColor() {
    System.out.println("黑色人种的皮肤颜色是黑色的");
    }

    @Override
    public void talk() {
    System.out.println("黑色人种会说话,一般听不懂");
    }
    }
    //黄色人种
    public abstract class AbstractYellowHuman implements Human{

    @Override
    public void getColor() {
    System.out.println("黄色人种的皮肤颜色是黄色的");
    }

    @Override
    public void talk() {
    System.out.println("黄色人种会说话,一般说的都是双字节");
    }
    }

    每个抽象类都有两个实现类,分别实现公共的最细节、最具体的事物:皮肤和语言。以黄色女性人种威力,代码清单如下:

    public class FemaleYellowHuman extends AbstractYellowHuman{
    @Override
    public void getSex() {
    System.out.println("黄色人种女性");
    }
    }
    public class MaleYellowHuman extends AbstractYellowHuman{
    @Override
    public void getSex() {
    System.out.println("黄种男性");
    }
    }

    其它的黑色人种,白色人种的男性和女性代码与此类似,不再重复编写。到此为止我们已经把真实世界的人种都定义出来了,剩下的工作就是怎么制造人类了。接口HumanFactory的代码清单如下:

    public interface HumanFactory {
    //制造一个黄色人种
    public Human createYellowHuman();
    //制造一个黑色人种
    public Human createBlackHuman();
    //制造一个白色人种
    public Human createWhiteHuman();
    }

    接下来,我们在定义两个分别产生男性和女性的工厂类:

    public class FemaleFactory implements HumanFactory{
    //生产黄色女性
    @Override
    public Human createYellowHuman() {
    return new FemaleYellowHuman();
    }
    //生产黑色女性
    @Override
    public Human createBlackHuman() {
    return new FemaleBlackHuman();
    }
    //生产白色女性
    @Override
    public Human createWhiteHuman() {
    return new FemaleWhiteHuman();
    }
    }

    public class MaleFactory implements HumanFactory{
    //生产黄色男性
    @Override
    public Human createYellowHuman() {
    return new MaleYellowHuman();
    }
    //生产黑色男性
    @Override
    public Human createBlackHuman() {
    return new MaleBlackHuman();
    }
    //生产白色男性
    @Override
    public Human createWhiteHuman() {
    return new MaleWhiteHuman();
    }
    }

    那么,接下来我们来看一下女娃造人的场景。

    public class NvWa {
    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.getColor();
    femaleYellowHuman.talk();
    femaleYellowHuman.getSex();
    System.out.println("----生产一个黄色男性----");
    maleYellowHuman.getColor();
    maleYellowHuman.talk();
    maleYellowHuman.getSex();
    /**
    * 后面继续创建
    */
    }
    
    


  • 相关阅读:
    MFC中char*,string和CString之间的转换(待补充)
    Gem/Bundle/Rvm
    Ruby开发入门
    Maven原型骨架及常见问题
    Nginx Upstream模块源码分析(上)
    mysqldump的几个主要选项探究
    探索Antlr(Antlr 3.0更新版)
    Maven2插件开发入门
    说说家乡的互联网-沈阳
    Nginx模块之SessionSticky
  • 原文地址:https://www.cnblogs.com/junjiang3/p/8097847.html
Copyright © 2011-2022 走看看