JS学习十七天----工厂方法模式

工厂方法模式

前言

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

正文

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

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

//几个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中创建对象会习惯的使用new关键字和类构造函数(淡然主要还是对象字面量),问题在于这样会导致两个类之间产生依赖性.

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

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

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

实例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;
	}

那么接下来就很简单了,对于来自A厂商的货

var aShop=new ABicycleShop();

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

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

工厂模式使用场合

1.动态实现

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

2.节省开销

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

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

4使用工厂模式的优缺点

好处是可以消除对象见的耦合,通过使用工程方法而不是new 关键字.将所有实例化的代码集中在一个位置房子代码重复.

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 09:33:54

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

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

简单工厂模式VS工厂方法模式: 简单工厂模式:最大长处在于工厂类中必须包括必要的逻辑推断,依据client选择条件动态实例化相关类,对于client来说,去除了与详细产品的依赖. 工厂方法模式(Factory Method).定义一个用于创建对象的接口.让子类决定实例化哪一个类.工厂方法模式使一个类的实例化延迟到其子类. 工厂方法模式实现时.client须要决定实例化哪一个工厂来实现对应的类.选择推断的问题还是存在的,也就是说,工厂方法模式把简单工厂的内部逻辑推断移动了client代码来进行.

学习笔记之工厂方法模式

public interface Factory { public abstract Fruits product(); } 工厂接口 public interface Fruits { public abstract void growth(); } 水果接口 public class Apple implements Fruits { public Apple() { // TODO Auto-generated constructor stub } @Override public voi

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

简单工厂模式VS工厂方法模式: 简单工厂模式:最大优点在于工厂类中必须包含必要的逻辑判断,根据客户端选择条件动态实例化相关类,对于客户端来说,去除了与具体产品的依赖. 工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法模式使一个类的实例化延迟到其子类. 工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现相应的类,选择判断的问题还是存在的,也就是说,工厂方法模式把简单工厂的内部逻辑判断移动了客户端代码来进行.想要加功能,在简单工厂模式

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

注:空心箭头表示的是种继承关系,工厂类和产品类之间是一种依赖关系.是用箭头加虚线表示的,以下的模型图是用的实线是不正确(时间不够用,在这里我偷懒了.这个习惯不好,呵呵) 简单工厂模式(Simple Factory Pattern): 使用一个类(通常为单体)来创建实例;简单工厂模式也叫静态工厂方法模式(Static FactoryMethod Pattern). 接口的定义通常是以I开头标识符,在JS中未定义接口或抽象类的语法: var MacBikeFactory = { createBike

设计模式学习笔记--工厂方法模式

学习过简单工厂模式,感觉很好用.在创建对象时,可以将复杂的初始化操作从客户端分离出来,简化客户端代码.大大的减少了代码修改的难度.而且可以通过参数不同,创建不同的对象. 但是简单工厂模式也有一些弊端,违背了开放--封闭原则.即如果我们增加了一个产品,对应的工厂也要进行修改,即switch---case中要新增加一些分支条件,不利于扩展.所以就有了下面的工厂方法模式: 工厂方法模式:定义了一个用于创建对象的接口,子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到子类. // 设计模式Dem

java/android 设计模式学习笔记(3)---工厂方法模式

这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或取得对象的初始设置:选择生成哪个子对象实例:或在生成你需要的对象之前必须先生成一些辅助功能的对象,这个时候就需要了解该对象创建的细节,也就是说使用的地方与该对象的实现耦合在了一起,不利于扩展,为了解决这个问题就需要用到我们的工厂方法模式,它适合那些创建复杂的对象的场景,工厂方法模式也是一个使用频率很

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

前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类)用来制造对象. 当一个人想要用手机的时候,需要自己创建手机然后来使用. 如下: public class IphoneX { public IphoneX(){ System.out.println("##### 制造iphoneX #####"); } } public class I

设计模式学习(一)——工厂方法模式

这里抄一段维基百科的定义,工厂方法模式即:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行. 下图展示了一个工厂方法模式的结构图: 在上图中,展示了一个工厂方法模式的使用过程,消费者(类的使用者)要购买一个运动产品,他需要到该产品的生产厂家那里购买,生产厂家实现“运动产品”的生产.在这个过程中,消费者只需要特定功能的产品,而不管功能是如何实现的.工厂只需要生产指定产品,而不管产品是如何设计的.而产品类只需要提供产品功能的设计. 这与iphone

设计模式学习第四天:2.3工厂方法模式以及演化

一. 工厂方法(Factory Method)模式      工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中.      工厂方法模式是简单工厂模式的进一步抽象和推广.由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点.      在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做.这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细