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

本文共 2299 字,大约阅读时间需要 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();    }}

 

转载地址:http://geivo.baihongyu.com/

你可能感兴趣的文章
MySQL
查看>>
socket编程:简单的TCP服务器
查看>>
Bootstrap常用插件
查看>>
js获取屏幕高度宽度
查看>>
null和undefined的区别
查看>>
计算机系统概论
查看>>
使用nginx很卡之strace命令
查看>>
第一冲刺阶段站立会议07
查看>>
python-匿名函数
查看>>
x5首页显示信息
查看>>
Redis入门(一)系统安装
查看>>
快速更新package.json文件
查看>>
Windows Azure 微软公有云体验(三) IIS中文编码解决方案
查看>>
神剧制作《黑镜》第四季基本剧情,良心制作
查看>>
poj2182 Lost Cows (线段树)
查看>>
Hadoop从2.2.0到2.7
查看>>
利用maven将jar包添加到本地仓库中
查看>>
Python基本数据类型(字典)
查看>>
The next day to learn English
查看>>
VS2017编译Qt x64
查看>>