工厂方法模式

前言

今天自己看了一下自己写的部分博客,发现写的好丑....開始注意自己的排版!!可是偏亮也不是一朝一夕就完毕的,我尽量让它美丽一点.....每天美丽一点点

正文

工厂方法模式是一种实现”工厂”概念的面向对象设计模式.实质是定义一个创建对象的接口,可是让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行.

创建一个对象经常须要复杂的过程,所以不适合在一个复杂的对象中.创建对象可能会导致大量的反复代码,也可能提供不了足够级别的抽象.工厂方法模式通过定义一个单独的创建对象的方法来解决这些问题,由子类实现这种方法来创建详细类型的对象.

//几个Button类
class Button{/* ...*/}
class WinButton extends Button{/* ...*/}
class MacButton extends Button{/* ...*/} //它们的工厂类
interface ButtonFactory{
abstract Button createButton();
}
class WinButtonFactory implements ButtonFactory{
Button createButton(){
return new WinButton();
}
} class MacButtonFactory implements ButtonFactory{
Button createButton(){
return new MacButton();
}
}

在JS中创建对象会习惯的使用newkeyword和类构造函数(淡然主要还是对象字面量),问题在于这样会导致两个类之间产生依赖性.

工厂模式就是一种又处于消除两个类依赖性的模式.

简单工厂模式:使用一个类(通常为单体)来生成实例

复杂工厂类:使用子类来决定一个变量成员应该为哪个详细的类的实例.

实例1:简单工厂模式

对于自行车商店出售自行车

var BicycleShop=function(){};
BicycleShop.prototype={
sellBicycle:function (model){
var bicycle;
switch(model){
case "A"://A类型的自行车
bicycle=new A();
break;
case "B":
bicycle=new B();
break;
case "C":
bicycle=new C();
break;
}
Interface.ensureImplements(bicycle,Bicycle); return bicycle;
}
}

分析:

sellBicycle方法依据所提示的的自行车型号来进行自行车的实例创建.各种型号的自行车实例能够互换使用,由于他们都实现了Bicycle接口.

注意:接口在工厂模式中起着非常关键的数据.假设部队对象进行某种类型检查以确保事实上现了必需的方法,工厂模式带来的优点也就所剩无几了.

那么对于ABC这家店铺来说,我须要它的A车型,那么我仅仅须要

var ABC=new BicycleShop();
var myBike=ABC.sellBicycle(“A”);

以上方式非常管用,可是一但说我须要加入一些自行车款式的时候,比方我想能生产D类型的自行车,这就须要我改动BicycleShop的switch部分,那么仅仅要是改动就有可能带来BUG.所以,将这部分生成实例的代码提出来交给一个简单的工厂对象是一个非常不错的方法.

var BicycleFactory={
createBicycle:function(model){
var bicycle;
switch(model){
case "A":
bicycle=new A();
break;
case "B":
bicycle=new B();
break;
case "C":
default:
bicycle=new C();
break;
}
return bicycle;
}
}

BicycleFactory是一个脱离于BicycleShop的单体.用来把createBicycle方法封装在一个命名空间中.BicycleFactory返回一个实现了Bicycle接口的对象.当须要加入新的类型的时候,不须要懂BicycleShop仅仅须要改动工厂单体对象就能够:

var BicycleShop=function (){};
BicycleShop.prototype={
sellBicycle:function(model){
var bicycle=BicycleFactory.createBicycle(model);
return bicycle;
}
}

以上就是一个非常好的简单工厂的实例.该模式将成员对象的创建工作交给一个外部对象实现,该外部对象能够是一个简单的命名空间,也能够是一个类的实例.

实例2:工厂模式

真正的工厂模式与简单工厂模式对照,主要差别就是它不是另外使用一个对象或者类来创建实例(自行车),而是使用一个子类.工厂是一个将其成员对象的实例化推迟到子类中进行的类.

比方BicycleShop能够决定从那一家厂商进行进货,那么简单的一个BicycleFactory是不够的,由于各个厂商会各自生产不同型号的自行车,所以首先须要生成各自厂商的shop实例,不同厂商的shop实例拥有不同的生成几个型号自行车的方法.

也就是相当于将自行车对象的实例化推迟到了shop实例中产生.

基础:

</pre><p><pre name="code" class="javascript">var BicycleShop=function (){};
BicycleShop.prototype={
sellBicycle:function(model){
var bicycle=BicycleFactory.createBicycle(model);
return bicycle;
},
createBicycle:function(model){
throw new Error("在使用类不支持的操作");
}
}

这个类定义了createBicycle方法,但真要调用这种方法的话,会抛出一个错误.如今BicycleShop是一个抽象类,他不能被实例化,仅仅能用来派生子类.设计一个经销特定自行车生产厂家产品的子类须要扩展BicycleShop,重定义当中的createBicycle方法.

各自厂商:

var ABicycleShop=function(){};
extend(ABicycleShop,BicycleShop);
ABicycleShop.prototype.createBicycle=function(model){
var dicycle;
switch(model){
case "A":
bicycle=new A();
break;
case "B":
bicycle=new B();
break;
case "C":
default:
bicycle=new C();
break;
}
return bicycle;
} var BBicycleShop=function(){};
extend(BBicycleShop,BicycleShop);
BBicycleShop.prototype.createBicycle=function(model){
var dicycle;
switch(model){
case "A":
bicycle=new A();
break;
case "B":
bicycle=new B();
break;
case "C":
default:
bicycle=new C();
break;
}
return bicycle;
}

那么接下来就非常easy了,对于来自A厂商的货

var aShop=new ABicycleShop();

var newBicycle=aShop.sellBicycle(“A”);

当然,你也能够对于外层生成的子类实例在使用简单工厂模式进行包装一下,对于加入其它厂商也非常easy,再创建一个Bicycle的子类重定义其createBicycle的工厂方法就可以.

工厂模式使用场合

1.动态实现

比如自行车的样例,创建一些用不同方式实现统一接口的对象,那么能够使用一个工厂方法或者简单工厂对象来简化实现过程.选择能够是明白进行的也能够是隐含的.

2.节省开销

假设对象要进行复杂的而且批次相关的设置的时候,那么工厂模式能够显著的降低每种队形的代码量.将特定的设置代码提取出来会使得代码有极大的提升.而且能优化结构便于维护.

3.用于很多小型对象组成一个大对象

4使用工厂模式的优缺点

优点是能够消除对象见的耦合,通过使用project方法而不是new keyword.将全部实例化的代码集中在一个位置房子代码反复.

缺点是大多数类最好使用newkeyword和构造函数,能够让代码更加简单易读.而不必去查看工厂方法来知道.

JS学习十七天----工厂方法模式的更多相关文章

  1. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  2. 学习日记之工厂方法模式和Effective C++

    简单工厂模式VS工厂方法模式: 简单工厂模式:最大长处在于工厂类中必须包括必要的逻辑推断,依据client选择条件动态实例化相关类,对于client来说,去除了与详细产品的依赖. 工厂方法模式(Fac ...

  3. 再起航,我的学习笔记之JavaScript设计模式06(工厂方法模式)

    上一次已经给大家介绍了简单工厂模式,相信大家对创建型设计模式有了初步的了解,本次我将给大家介绍的是工厂方法模式. 工厂方法模式 工厂方法模式(Factory Method):通过对产品类的抽象使其创建 ...

  4. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

  5. 【JS设计模式】温习简单工厂模式、工厂方法模式、抽象工厂模式概念

    注:空心箭头表示的是种继承关系,工厂类和产品类之间是一种依赖关系.是用箭头加虚线表示的,以下的模型图是用的实线是不正确(时间不够用,在这里我偷懒了.这个习惯不好,呵呵) 简单工厂模式(Simple F ...

  6. C#设计模式学习笔记:(2)工厂方法模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...

  7. 【2016-10-17】【坚持学习】【Day8】【工厂方法模式】

    工厂方法模式又叫工厂模式,虚拟构造器模式 定义: 工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该 ...

  8. (@WhiteTaken)设计模式学习——工厂方法模式

    这个工厂方法模式,是简单工厂的延伸,不同点在于,将某个具体的类继续细分,将核心部分抽象成一个接口.而简单工厂,把核心写在了一个类上,不利于拓展. 举个例子,简单工厂中有苹果类,香蕉类,我们创建了一个F ...

  9. 设计模式C++学习笔记之五(Factory Method工厂方法模式)

      工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的 ...

随机推荐

  1. Spring boot配置404、500页面

    Spring boot 配置404页面很简单,如果你访问的url没有找到就会出现spring boot 提示的页面,很明显Spring boot不用配置就可以显示404页面了. 在template下创 ...

  2. red hat linux之Samba、DHCP、DNS、FTP、Web的安装与配置

    本教程是在red hat linux 6.0环境下简单测试!教程没有图片演示,需要具有一定Linux基础知识,很多地方的配置需要根据自己的情况修改,照打不一定可以配置成功.(其他不足后续修改添加) y ...

  3. Python ftplib 模块关于 ftp的下载

    import ftplib import os import socket import sys HOST='192.168.216.193' DIRN='c:\\ftp\FTP.123' FILE= ...

  4. Mean, Median, Mode, Range, and Standard Deviation

    Descriptive statistics tell you about the distribution of data points in data set. The most common m ...

  5. thttpd 在S3C6410的移植-web服务程序的应用

    1.    在VMWare 虚拟机上将arm-linux-gcc 4.3.1配置好:2.    下载thttpd软件包并解压:3.    在thttpd根目录下运行:  ./configure:4.  ...

  6. SpringBoot实战(三)代码热部署

    每次代码改动后都需要重新手动Run项目,心累,在网上找了下,发现SpringBoot提供了热部署的方案,改动代码后自动编译打包,现在将热部署的配置方法记下来: 第一步:在pom.xml中添加依赖,导入 ...

  7. LaTeX 写算法伪码

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50054953 LaTeX写算法伪码,需 ...

  8. Lock-less buffer management scheme for telecommunication network applications

    A buffer management mechanism in a multi-core processor for use on a modem in a telecommunications n ...

  9. bzoj1831: [AHOI2008]逆序对(DP+双精bzoj1786)

    1831: [AHOI2008]逆序对 Description 小可可和小卡卡想到Y岛上旅游,但是他们不知道Y岛有多远.好在,他们找到一本古老的书,上面是这样说的: 下面是N个正整数,每个都在1~K之 ...

  10. 对OC中property的一点理解

    最近在看即将要加入的项目的代码,看到一个protocol里包含着几个property.之前没有写过类似的代码,看到这里的时候,突然疑惑了一下,发现自己对property的理解好像有点模糊.所以回家后又 ...