博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】工厂方法模式
阅读量:6331 次
发布时间:2019-06-22

本文共 2349 字,大约阅读时间需要 7 分钟。

使用频率:★★★★★

一、什么是工厂方法

具体的工厂对象负责生产具体的产品对象;

二、补充说明

符合开放--封闭"原则(OCP),新增产品时,只需新增工厂的实现类、产品的实现类,不修改原来的代码;

属于23种GOF设计模式中的一种;

三、角色

  • 抽象工厂
  • 具体工厂
  • 抽象产品
  • 具体产品
  • 产品使用者

具体工厂'继承'抽象工厂;

具体产品'继承'抽象产品;

每个具体工厂负责生产对应的具体产品;

产品使用者使用每个具体工厂生产的具体产品;

四、例子

类关系图:

代码实现:

【抽象工厂】定义一个工厂接口,包含一个创建实例的方法,如下:

package com.pichen.dp.creationalpattern.factorymethod;public interface IFatherFactory {    public Father createFather(String name);}

【具体工厂】定义两个具体工厂类,实现工厂接口,如下:

package com.pichen.dp.creationalpattern.factorymethod;public class ChineseFatherFactory implements IFatherFactory{    @Override    public Father createFather(String name) {        return new ChineseFather(name);    }}
package com.pichen.dp.creationalpattern.factorymethod;public class AmericanFatherFactory implements IFatherFactory{    @Override    public Father createFather(String name) {        return new AmericanFather(name);    }}

【抽象产品】定义一个抽象产品类:

package com.pichen.dp.creationalpattern.factorymethod;public abstract class Father {    private String name;    /**     * @return the name     */    public String getName() {        return name;    }    /**     * @param name the name to set     */    public void setName(String name) {        this.name = name;    }        public abstract void printName();}

【具体产品】定义两个具体产品类,继承抽象产品:

package com.pichen.dp.creationalpattern.factorymethod;public class ChineseFather extends Father{    public ChineseFather(String name) {        this.setName(name);    }    @Override    public void printName() {        System.out.println(this.getClass().getName() + ":" + this.getName());    }}
package com.pichen.dp.creationalpattern.factorymethod;public class AmericanFather extends Father{    public AmericanFather(String name) {        this.setName(name);    }    @Override    public void printName() {        System.out.println(this.getClass().getName() + ":" + this.getName());    }}

【产品使用者】写个main函数,调用具体工厂类生产具体产品:

package com.pichen.dp.creationalpattern.factorymethod;public class Main {    public static void main(String[] args) {        IFatherFactory cnff = new ChineseFatherFactory();        Father cnFather = cnff.createFather("cn father");        cnFather.printName();                IFatherFactory usff = new AmericanFatherFactory();        Father usFather = usff.createFather("us father");        usFather.printName();    }}

 

转载于:https://www.cnblogs.com/chenpi/p/5141376.html

你可能感兴趣的文章
【算法】论平衡二叉树(AVL)的正确种植方法
查看>>
基于DDD的现代ASP.NET开发框架--ABP系列之1、ABP总体介绍
查看>>
【原】东拼西凑PBR(1):PBR基础
查看>>
react 从零开始搭建开发环境
查看>>
scala recursive value x$5 needs type
查看>>
ps -ef |grep 输出的具体含义
查看>>
markdown编辑
查看>>
ASCII 在线转换器
查看>>
Linux内核同步:RCU
查看>>
Android逆向进阶——让你自由自在脱壳的热身运动(dex篇)
查看>>
Java设计模式之五大创建型模式(附实例和详解)
查看>>
60 Permutation Sequence
查看>>
主流的RPC框架有哪些
查看>>
Hive学习之路 (七)Hive的DDL操作
查看>>
[转]mysql使用关键字作为列名的处理方式
查看>>
awesome go library 库,推荐使用的golang库
查看>>
树形展示形式的论坛
查看>>
jdbcTemplate 调用存储过程。 入参 array 返回 cursor
查看>>
C++中的stack类、QT中的QStack类
查看>>
Linux常用基本命令[cp]
查看>>