工厂方法模式(Method Factory),理解多态应用的好例子.
工厂方法模式又称为多态性工厂,个人认为多态性工厂更能准确的表达这个模式的用处.与简单工厂(静态工厂)相比较,这里的多态性是指抽象出一个工厂基类,将因为一个产品有N种不同的是现这种变化封装起来,将具体的实例化延迟到了工厂类的子类中来实现.
谈谈耦合关系先
面向对象设计模式的学习重点应该是寻找业务变化的点,让紧耦合变的松一些,这样面对需求变化修改代码时才会付出最小的代价,同时也实现了代码的复用,维护.学习的重点不应该放在代码,结构,这些表现形式上.模块之间的紧耦合关系在面对业务变化时是非常脆弱的,会因为一处的修改导致好多地方跟着修改,在面向对象设计中,将高层模块(抽象层)与低层模块(实现层)隔离开,因为抽象层相对稳定,而实现层正是业务需求变化的部分,这也就是依赖倒置原则,可以说整个设计模式都是围绕着寻找抽象层与实现层来展开的.
意图
定义一个用于创建对象的接口,让子类决定实例化哪个类,把实例化工作延迟到子类.
结构

从上图中可以看出,AbstractFactory抽象出了一个createProduct()方法,具体的实现交给了FactoryImplA与FactoryImplB两个实现类,分别对应创建ProductImplA与ProductImplB. 客户端代码调用时直接new的方式给出FactoryImplX具体实例,返回AbstractProduct抽象产品对象.
代码演示
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 抽象产品
*
* @author aladdinty
* @create 2018-01-02
**/
public interface AbstractProduct
{
public String getProductInfo() ;
}
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 工厂方法基类
*
* @author aladdinty
* @create 2018-01-02
**/
public abstract class AbstractFactory
{
public abstract AbstractProduct createProdct() ;
}
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 具体的工厂
*
* @author aladdinty
* @create 2018-01-02
**/
public class FactoryImplA extends AbstractFactory
{
@Override
public AbstractProduct createProdct ()
{
return new ProductImplA ();
}
}
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 工厂实现B
*
* @author aladdinty
* @create 2018-01-02
**/
public class FactoryImplB extends AbstractFactory
{
@Override
public AbstractProduct createProdct ()
{
return new ProductImplB () ;
}
}
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 具体实现A
*
* @author aladdinty
* @create 2018-01-02
**/
public class ProductImplA implements AbstractProduct
{
@Override
public String getProductInfo ()
{
return "ProductA_IMPL";
}
}
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 具体实现B
*
* @author aladdinty
* @create 2018-01-02
**/
public class ProductImplB implements AbstractProduct
{
@Override
public String getProductInfo ()
{
return "ProductB_IMPL";
}
}
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 调用处
*
* @author aladdinty
* @create 2018-01-02
**/
public class Client
{
public static void main(String[] args )
{
AbstractProduct producta = new FactoryImplA ().createProdct () ;
System.out.println (producta.getProductInfo ());
AbstractProduct productb = new FactoryImplB ().createProdct () ;
System.out.println ( productb.getProductInfo () );
}
}
运行结果
ProductA_IMPL
ProductB_IMPL
应对修改
如果需要增加新的Product实现,只需要增加一个ProductImplXX,再对应增加一个FactoryImplXX,然后修改一下Client的调用处new FactoryImplXX(),当然这个地方可以用反射之类的技术来替代. 应对这种Product产品实现修改的需求时,工厂方法模式完全符合开闭原则. 而之前所说的简单工厂模式则无法做到,因为要修改工厂方法内部的if else判断.当然也不是说工厂方法模式就比简单方法模式高级,只是应用场景不同,工厂方法解决的变化点是产品类型的不固定变化.而简单工厂只是解决调用处对具体产品实现的隔离,假设产品的实现是相对稳定的.
工厂方法模式(Method Factory),理解多态应用的好例子.的更多相关文章
- Java设计模式-工厂方法模式(Factory Method)
工厂方法模式(Factory Method) 工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建.在以下的三种模式中,第一种如果传入的字符串有误,不能正确创 ...
- .NET设计模式(5):工厂方法模式(Factory Method)(转)
工厂方法模式(Factory Method) ——.NET设计模式系列之五 Terrylee,2004年1月2日 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实 ...
- .NET设计模式(5):工厂方法模式(Factory Method)
):工厂方法模式(Factory Method) 工厂方法模式(Factory Method) --.NET设计模式系列之五 Terrylee,2004年1月2日 转载:http://terry ...
- 设计模式---对象创建模式之工厂方法模式(Factory Method)
前提:“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式(表现最为突出) 工 ...
- NET设计模式 第二部分 创建型模式(4):工厂方法模式(Factory Method)
工厂方法模式(Factory Method) ——.NET设计模式系列之五 Terrylee,2004年1月2日 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实 ...
- 工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)
分类 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的.工厂模式在<Java 与模式>中分为三类:1)简单工厂模式(Simple Facto ...
- 设计模式之笔记--工厂方法模式(Factory Method)
工厂方法模式(Factory Method) 定义 工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 类图 描 ...
- java设计模式学习 ----- 工厂方法模式(Factory Method)
工厂方法模式(Factory Method) 工厂方法模式分为三种:普通工厂模式.多个工厂方法模式.静态工厂方法模式 普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 关系图 ...
- 深入浅出设计模式——工厂方法模式(Factory Method)
介绍在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式.它解决的仍然是软件设计中与创建对象有关的问题.它可以更好的处理客户的需求变化. 引入我 ...
随机推荐
- Server SQL2008对文件的基础操作(1)
1.一个文件的基本框架为:文件名.文件地址.文件大小.文件最大的大小.文件的增量(Filegrowth). 2.文件有mdf.ndf.ldf 三种文件的区别. 3.文件组可以进行文件的管理 FileG ...
- 条件注释判断IE版本
在学习Bootstra的时候看到这么一句话, <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media ...
- Python中的选择排序
选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大 ...
- Git版本控制器的使用
首先介绍一下什么是Git:git是目前最流行的版本控制系统,属于分布式版本控制器. 使用Git前先要在GitHub创建代码仓库,或者获取你要应用的GitHub的链接地址. 创建GitHub仓库这里就不 ...
- TensorFlow —— Demo
import tensorflow as tf g = tf.Graph() # 创建一个Graph对象 在模型中有两个"全局"风格的Variable对象:global_step ...
- gitlab环境搭建
企业级的git管理程序.最好用的之一吧.估计其它的也得叫之二. 怎么搭建呢? 2G以上配置的机器才可以搞. . 如下 安装需要注意的是.如果开了80端口,8080的需要修改配置文件 下面会提到 1. ...
- Linux学习之在搭建java开发环境
首先,在官网上下载你需要的JDK 然后 解压包 tar -zxvf 包名 配置环境变量 vim /etc/profile 如果权限不够,就使用sudo vim /etc/profile 在profi ...
- easyUI带复选框的组合树
代码: <input id="depts"><script type="text/javascript">$(document).rea ...
- 一键架设FastDFS分布式文件系统脚本,基于Centos6
一.使用背景 业务驱动技术需要,原来使用 FTP和 Tomcat upload目录的缺陷日渐严重,受限于业务不断扩大,想使用自动化构建,自动化部署,Zookeeper中心化,分布式RPC DUBBO等 ...
- 分布式服务Dubbo+Zookeeper安全认证
前言 由于之前的服务都是在内网,Zookeeper集群配置都是走的内网IP,外网不开放相关端口.最近由于业务升级,购置了阿里云的服务,需要对外开放Zookeeper服务. 问题 Zookeeper+d ...