北纬36度
北纬36度

学习、记录、分享


  • 主页

  • 分类

  • 归档

  • 留言

  • 关于我

工厂方法模式(上)

发表于 2020-12-30 | 分类于 设计模式 | 0 | 阅读次数 52

什么是工厂方法模式

定义一个抽象接口,这个接口其实现类来选择实例化哪一个类。简单来说就是实例化不再通过new而是通过一个类,这个类是工厂类。

工厂方法模式最简单例子

我们想象女娲造人,这里涉及三样,女娲、炼造炉、人类,其中人类是一个抽象类,其有很多实现类,有黄色、白色和黑色人种。锻造炉就是一个工厂,在这个工厂可以指定去造哪一种类型的人。这里我们吧锻造炉用一个接口声明,其实现类里有相应的方法来选择去锻造哪一种类型的人类。女娲就是一个场景类。具体UML图和代码如下
image.png
package case1;

/**
 * <pre>人类总称</pre>
 *
 * @author QuinnTian
 * @since
 */
public interface Human {
    /*获取人类的颜色*/
    public void getColor();
    /*人类说话*/
    public void talk();
}

package case1;

/**
 * <pre>黑色人种</pre>
 *
 * @author QuinnTian
 * @since
 */
public class BlackHuman implements Human {
    @Override
    public void getColor() {
        System.out.println("黑色人种的皮肤是黑色的。");
    }

    @Override
    public void talk() {
        System.out.println("黑人正在说话..");

    }
}

package case1;

/**
 * <pre></pre>
 *
 * @author QuinnTian
 * @since
 */
public class WhiteHuman implements Human {
    @Override
    public void getColor() {
        System.out.println("白色人种的皮肤是白色的。");

    }

    @Override
    public void talk() {
        System.out.println("白色人种在说话。");

    }
}

package case1;

/**
 * <pre></pre>
 *
 * @author QuinnTian
 * @since
 */
public class YellowHuman implements Human {
    @Override
    public void getColor() {
        System.out.println("黄色人种的皮肤是黄色的。");

    }

    @Override
    public void talk() {
        System.out.println("黄色人种正在说话。");

    }
}

package case1;

/**
 * <pre>创建人类的抽象工厂</pre>
 *
 * @author QuinnTian
 * @since
 */
public abstract class AbstractHumanFactory {
    public abstract <T extends Human> T createHuman(Class<T> c);
}

package case1;

/**
 * <pre></pre>
 *
 * @author QuinnTian
 * @since
 */
public class HumanFactory extends AbstractHumanFactory {

    @Override
    public <T extends Human> T createHuman(Class<T> c) {
        /*定义一个生产的人种*/
        Human human = null;
        try {
            /*产生一个人种*/
            human = (T)Class.forName(c.getName()).newInstance();
        }catch (Exception e){
            System.out.println("人类产生错误!");
        }
        return (T)human;
    }
}

package case1;

/**
 * <pre></pre>
 *
 * @author QuinnTian
 * @since
 */
public class NvWa {
    public static void main(String args[]){
        /*模拟女娲造人*/
        AbstractHumanFactory abstractHumanFactory = new HumanFactory();
        System.out.println("第一次造出的人是黑人");
        Human blackHuman = abstractHumanFactory.createHuman(BlackHuman.class);
        blackHuman.getColor();;
        blackHuman.talk();

        System.out.println("第二次造出的人是白人");
        Human whiteHuma = abstractHumanFactory.createHuman(WhiteHuman.class);
        whiteHuma.getColor();
        whiteHuma.talk();

        System.out.println("第三次造出的人是黄人");
        Human yellowHuman = abstractHumanFactory.createHuman(YellowHuman.class);
        yellowHuman.getColor();
        yellowHuman.talk();
    }

}

工厂方法模式通用模板

上面的女娲造人的过程,可以用一个通用的代码模板来表示,UML图。
image.png

package case2;

/**
 * <pre>抽象产品类</pre>
 *
 * @author QuinnTian
 * @since
 */
public abstract class Product {

    /*产品类的公用方法*/
    public void method (){
        /*业务逻辑处理*/
    }
    /*抽象方法*/
    public abstract void method2();
}
package case2;

/**
 * <pre></pre>
 *
 * @author QuinnTian
 * @since
 */
public class ConcreteProduct1 extends Product {
    @Override
    public void method2() {
        /*业务逻辑处理*/
    }
}

package case2;

/**
 * <pre></pre>
 *
 * @author QuinnTian
 * @since
 */
public class ConcreteProduct2 extends Product {
    @Override
    public void method2() {
        /*业务逻辑处理*/
    }
}

package case2;

/**
 * <pre>抽象工厂类</pre>
 *
 * @author QuinnTian
 * @since
 */
public abstract class Creator {
    /**/
    public abstract <T extends Product> T createPoduct(Class<T> c);
}

package case2;

/**
 * <pre></pre>
 *
 * @author QuinnTian
 * @since
 */
public class ConcreteCreator extends Creator {
    @Override
    public <T extends Product> T createPoduct(Class<T> c) {
        Product product = null;
        try {
            product = (Product) Class.forName((c.getName())).newInstance();
        }catch (Exception e){

        }
        return (T)product;
    }
}

package case2;

/**
 * <pre>场景类</pre>
 *
 * @author QuinnTian
 * @since
 */
public class Client {
    public static void main(String args[]){
        Creator creator = new ConcreteCreator();
        Product product = creator.createPoduct(ConcreteProduct1.class);
        /*......*/
    }
}

如果对你有帮助,请点击打赏谢谢。
Quinn Tian 微信支付

微信支付

Quinn Tian 支付宝

支付宝

  • 本文作者: Quinn Tian
  • 本文链接: https://quinntian.com/?p=93
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# 设计模式 # 工厂模式 # 工厂方法模式
单例模式
工厂方法模式(下)4种扩展
  • 文章目录
  • 站点概览
Quinn Tian

Quinn Tian

分享、记录、学习

70 日志
18 分类
97 标签
RSS
Github E-mail
Creative Commons
友情链接
  • 寒山志
  • 凉风有信
  • 阿业战记
  • 团子の小屋
  • 站长博客大全
  • 浮生博客
  • 旅行猫
  • 长野 の BLOG
  • 今今今生
  • 阿殇的博客
  • 开心的DCMickey
  • 无名域
  • 一信笔记
  • LOGI
  • zrxJuly's Blog
  • 栗先森
  • bestsort
  • 家用蒸烤箱
  • 小游
  • Aiden's Blog
  • 牛牛游戏网
  • DYBON
  • FGHRSH 的博客
  • geticsen
  • VVavE
  • 菠萝猫
  • 中国博客联盟
  • iBlog@zihua
  • 卢松松博客
  • 平凡的你我
  • 宇宙湾
  • 村头老杨头
  • 冰洛博客
  • 稻田守望者
  • 爱猫说设计狮网
  • 小维博客
  • 小浣熊的技术小站
© 2018 — 2021 Quinn Tian
由 Java 强力驱动
|
主题 - NexT.Muse-移植版
鲁ICP备1801591号-1
0%