工厂方法模式

前言

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

正文

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

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

//几个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. python继承 super()

    写这篇博文,始于以下问题的探究: #coding:utf-8 class A(object): def __init__(self): print 'enter A' print 'leave A' ...

  2. 'Upgrade' header is missing

    spring-websocket 握手失败是因为 有拦截器  注释掉拦截器就OK

  3. Uart,IIC和SPI的区别

    1.UART, SPI, IIC的详解 UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmi ...

  4. 【Educational Codeforces Round 41 (Rated for Div. 2) D】Pair Of Lines

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果点的个数<=3 那么直接输出有解. 否则. 假设1,2最后会在一条直线上,则把这条直线上的点都删掉. 看看剩余的点是否在同 ...

  5. 【codeforces 379D】New Year Letter

    [题目链接]:http://codeforces.com/contest/379/problem/D [题意] 让你构造出两个长度分别为n和m的字符串s[1]和s[2] 然后按照连接的规则,顺序连接s ...

  6. SWT自定义选项卡CTabFolder

    SWT自定义选项卡CTabFolder 学习了:http://blog.csdn.net/dreajay/article/details/17391731 package com.swt; impor ...

  7. hdu 2191 悼念512汶川大地震遇难同胞——珍惜如今,感恩生活

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ...

  8. Android4.2.2下Stagefright下OMX编解码器组件的控制流

    本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流. qq:1037701636 email:gzzaigcn2012@gmail.com Android源代码版本号Version ...

  9. Web端本地存储

    1.需求背景:当用户在页面上添加一行一行的数据时,突然发现网络断掉了,页面上编辑的数据没法保存进数据库,所以需要一个本地端的临时保存功能,以便在网络通畅后重新加载出来! 2.解决方案: 结合网上搜刮, ...

  10. UITextField限制输入长度

    首先,汉字的输入时的联想词在输入到TextFiled时,并不会走 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersIn ...