博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
121 项目 029 笔记向 设计模式 抽象工厂模式
阅读量:6477 次
发布时间:2019-06-23

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

hot3.png

抽象工厂模式定义

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类

能用类图如下:

输入图片说明

抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种,业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式.

通用源码

类图

输入图片说明

抽象产品A

package com.laolang.dp.abstractfactory;/** * 抽象产品A类 */public abstract class AbstractProductA {    // 每个产品共有的方法    public void shareMethod(){}    // 每个产品相同方法,不同实现    public abstract void doSomething();}

抽象产品B

package com.laolang.dp.abstractfactory;/** * 抽象产品B类 */public abstract  class AbstractProductB {    // 每个产品共有的方法    public void shareMethod(){}    // 每个产品相同方法,不同实现    public abstract void doSomething();}

产品AOne

package com.laolang.dp.abstractfactory;public class ProductAOne extends AbstractProductA {    @Override    public void doSomething() {        System.out.println("产品AOne");    }}

产品ATwo

package com.laolang.dp.abstractfactory;/** * 产品ATwo的实现 */public class ProductATwo extends AbstractProductA {    @Override    public void doSomething() {        System.out.println("产品ATwo的实现");    }}

产品BOne

package com.laolang.dp.abstractfactory;/** * 产品BOne */public class ProductBOne extends AbstractProductB {    @Override    public void doSomething() {        System.out.println("产品BOne");    }}

产品BTwo

package com.laolang.dp.abstractfactory;/** * 产品BTwo */public class ProductBTwo extends AbstractProductB {    @Override    public void doSomething() {        System.out.println("产品BTwo");    }}

抽象工厂

package com.laolang.dp.abstractfactory;/** * 抽象工厂类 */public abstract class AbstractFactory {    // 创建A产品家族    public abstract AbstractProductA createProductA();    // 创建B产品家族    public abstract AbstractProductB createProductB();}

One类产品工厂实现

package com.laolang.dp.abstractfactory;/** * 只生产产品One类产品 */public class ProductOneFactory extends AbstractFactory {    /**     * 只生产AOne类产品     * @return     */    @Override    public AbstractProductA createProductA() {        return new ProductAOne();    }    /**     * 只生产BOne类产品     * @return     */    @Override    public AbstractProductB createProductB() {        return new ProductBOne();    }}

Two类产品工厂实现

package com.laolang.dp.abstractfactory;/** * 只生产Two类产品 */public class ProductTwoFactory extends AbstractFactory {    /**     * 只生产ATwo类产品     * @return     */    @Override    public AbstractProductA createProductA() {        return new ProductATwo();    }    /**     * 只生产BTwo类产品     * @return     */    @Override    public AbstractProductB createProductB() {        return new ProductBTwo();    }}

使用

package com.laolang.dp.abstractfactory;import org.junit.Test;public class AbstractFactoryTest {    @Test    public void testOne(){        // 定义出两个工厂        AbstractFactory factoryOne = new ProductOneFactory();        AbstractFactory factoryTwo = new ProductTwoFactory();        // 生产AOne产品        AbstractProductA aOne = factoryOne.createProductA();        // 生产ATwo产品        AbstractProductA aTwo = factoryTwo.createProductA();        // 生产BOne产品        AbstractProductB bOne = factoryOne.createProductB();        // 生产BTwo产品        AbstractProductB bTwo = factoryTwo.createProductB();    }}

抽象工厂模式的优缺点

  • 优点

封装性

产品族内的约束为非公开状态

  • 缺点

纵向扩展困难,如再增加一个Three类街产品,则要大规模的修改代码

使用场景

一个对象族都有相同的约束,则可以使用抽象工厂模式

例如开发在三种不同操作系统上运行的程序,可以使用抽象工厂屏蔽操作系统的影响,由不同的产品类去处理与操作系统的交互

转载于:https://my.oschina.net/iamhere/blog/862097

你可能感兴趣的文章
windows server 2003各版本及2008各版本的最大识别内存大小
查看>>
OSChina 周六乱弹 ——揭秘后羿怎么死的
查看>>
IT人员的职业生涯规划
查看>>
sorry,you must have a tty to run sudo
查看>>
ios开发中使用正则表达式识别处理字符串中的URL
查看>>
项目中的积累,及常见小问题
查看>>
Python类型转换、数值操作(收藏)
查看>>
oracle11g dataguard 安装手册(转)
查看>>
java并发包分析之———Deque和LinkedBlockingDeque
查看>>
1. Two Sum - Easy - Leetcode解题报告
查看>>
多线程---同步函数的锁是this(转载)
查看>>
鱼C记事本V1.0(下)- 零基础入门学习Delphi28
查看>>
百练 2742 统计字符数 解题报告
查看>>
Ubuntu搜狗输入法候选词乱码
查看>>
js中回调函数写法
查看>>
React native android 最常见的10个问题
查看>>
数据结构和算法
查看>>
.Net 项目代码风格要求
查看>>
[pat]1045 Favorite Color Stripe
查看>>
Immutable学习及 React 中的实践
查看>>