文章分类:Java编程
假设有一个接口Fruit,Apple、Orange等类均实现该接口,当我们想创建一个Apple的对象时,我们通常写下:
Fruit apple=new Apple();
再想创建Orange对象时,我们又要写:
Fruit orange=new Orange();
当我们想要创建其他所需的Fruit实现类时,我们必须自己再写一条条的new语句,甚至要对之前的一些代码作修改,工厂模式就为解决这一问题而生,通常它会定义一个创建产品的工厂接口,将实际的创建工作推迟到子类中!
工厂模式包括简单工厂模式、工厂方法模式、抽象工厂模式。
简单工厂模式:
在这种模式中,有一个Factory类,它有一个getIns方法,每次根据传入的参数来创建对象。
比如:
class Factory{
public static Fruit getIns(String type){
if(type.equals("apple")){
return new Apple();
}
esle if(type.equals("orange")){
return new Orange();
}else{
return null;
}
}
}
这样,我们创建对象时只需要:
//创建Apple类对象
Fruit instance01=Factory.getIns("apple");
//创建Orange类对象
Fruit instance02=Factory.getIns("orange");
这样所有的对象创建均由Factory来处理,方便管理对象创建。同时依据传入的参数来创建对象,使程序有了一定的动态性,但是这种方法的缺点也还是很明显的,比如要新加一个Pear类,那么就需要对getIns(String type)方法进行修改,新加一个if else语句,每新加一个Fruit实现类时,就要修改一次,这样代码之间耦合度还是很高,目前抽象工厂模式已经很少使用了。
工厂方法模式:
这种模式在这三种模式中使用最为频繁,大家熟知的MVC框架通常就采用了工厂方法。
该模式可以看作对简单工厂模式的扩展,它进一步将工厂类抽象出来,得到一个工厂接口,每一个待创建的类都有一个自己的工厂类。用该方法对上述例子进行改进:
首先创建工厂接口:
interface Factory{
public Fruit getIns();
}
每种产品有一个实现工厂接口的工厂类:
class AppleFactory implements Factory{
public Fruit getIns(){
return new Apple();
}
}class OrangeFactory implements Factory{
public Fruit getIns(){
return new Orange();
}
}
这时,创建一个产品对象时,我们需要先创建相应的工厂类:
//创建Apple类对象
Factory factory=new AppleFactory();
Fruit instance01=factory.getIns();
//创建Orange类对象
factory=new OrangeFactory();
Fruit instance02=factory.getIns();
代码量确实增加了,但是值得注意的是:现在添加一个新的水果类时,对之前的代码不需做任何修改,只要增加实现Fruit接口的类与相应的工厂类即可。从高内聚低耦合角度来看,每个工厂类只负责生成相应的水果类,这属于高内聚,而不同类之间不互相影响,添加一个类或删除一个类,不需对其他类做任何修改,不同类之间几乎没有联系,这属于低耦合!并且符合“开-闭”原则(开闭原则要求能对软件进行功能扩展,并不应修改原有的代码。)
在MVC中,由于加入了反射技术,不用再写工厂类,使得代码更加简洁,但在此不作相关说明!
抽象工厂模式:
在讲解该模式之前,先来看一个概念:
产品族。
所谓产品族就是指:是以产品平台为基础,通过添加不同的个性模块,以满足不同客户个性化需求的一组相关产品(百度百科的定义),简单来说就是位于不同产品等级但功能相关联的产品组成的家族,比如sony的mp3与耳机是一个产品族,oppo的mp3与耳机也是一个产品族,mp3与耳机是不同等级的而功能相关的产品!
抽象工厂主要就应用于当系统提供多个产品族,而只需要使用其中一个产品族。
以产品族中提到的sony与oppo为例,采用抽象工厂方法来实现:
首先应为每种类型的产品设计接口
interface Mp3{
……
}
interface Headset{
……
}
为各个产品设计产品类
class SonyMp3 implements Mp3{
……
}
class SonyHeadset implements Headset{
……
}
class OppoMp3 implements Mp3{
……
}
class OppoHeadset implements Headset{
……
}
设计工厂接口:
interface Factory{
public Mp3 getMp3Ins();
public Headset getHeadsetIns();
}
让各个公司的工厂类实现工厂接口
class SonyFactory implements Factory{
public Mp3 getMp3Ins(){
return new SonyMp3();
}
public Headset getHeadsetIns(){
return new SonyHeadset();
}
}
class SonyFactory implements Factory{
public Mp3 getMp3Ins(){
return new OppoMp3();
}
public Headset getHeadsetIns(){
return new OppoHeadset();
}
}
有人看到这,也许会觉得很眼熟,甚至想当然的认为抽象工厂方法就是多个工厂方法的集合,那就在这将二者对比一下:
多个工厂方法中的产品是相互平行的,没有关系的,或者即使有关系但在设计中不必考虑,而抽象工厂中,主要面向的产品族,产品族的产品属于不同的产品等级,但又相互依存的,并且在抽象工厂模式中应体现出这种关系!理解产品族的概念,是理解抽象工厂关键。
抽象工厂方法很适合于应对“系列”的变更,但在难以应对“对象”的变更。比如在上述例子中有sony和oppo两家公司,这时想新加一个也是生产mp3和耳机的公司,只需让该公司实现工厂接口,公司产品实现各产品接口,之前的代码不需变更。而这时,这些公司突然想增加一种产品(比如:手机),他们必须了解手机的相关标准,然后设计自己品牌的手机,这时还产生什么影响,但手机设计出来后要投入生产,于是要在工厂内加入手机生产线,之前的工厂标准是能生产mp3和耳机,不符合现在要求,所以工厂的标准和各个公司的工厂都需修改!
分享到:
相关推荐
设计模式之:工厂模式 设计模式中常用的模式介绍和代码分析实例,简单明了的概述了这些模式
总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...
java常用设计模式-抽象工厂模式
c#几种常用的设计模式,包括单例模式、监视着模式、工厂方法模式和抽象工厂模式
常用设计模式例子:工厂模式,抽象工厂,策略模式等...
JAVA常用设计模式,包括:简单工厂、抽象工厂、单例、外观、桥接、代理等设计模式
java常用设计模式-工厂模式
几种常用的设计模式实例:单例 工厂 代理 命令 策略
1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
Java的一些常用设计模式,包括单例模式、门面模式、策略模式、观察者模式、建造者模式、简单工厂模式、抽象工厂模式、工厂方法模式、代理模式、动态代理模式,适合初学者掌握
Java常用的设计模式详解,包含: 1、单例模式 2、工厂模式 3、策略模式 4、观察者模式 等等模式……
23种常用设计模式,包括单例模式、工厂模式、桥接模式、适配器模式、亨元模式、抽象工厂模式等。
JAVA设计模式,定义:提供创建对象的接口. 为何使用? 工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。
以JAVA为例,汇总了十几种常用的设计模式,包括了:单例模式、工厂模式、建造者模式、适配器模式、装饰器模式、外观模式、命令模式、观察者模式、状态模式、策略模式、模板方法模式等。仅供学习使用。 相关文章请看...
java常用的设计模式一个简单总结,如工厂模式、单例模式、代理模式等等。(楼主也是未入门的菜鸟,如有错误请及时联系楼主更正,谢谢!)
java常用设计模式-工厂模式的实现.doc
JavaEE常用设计模式,MVC、DAO、工厂等等
详细的jsp网络编程、常用设计模式! 前言 3 第一部分:网络编程 4 一、了解URL 4 二、读取URL中的资源 4 1、URL构造方法: 5 2、读取资源 5 三、INETADDRESS类 5 四、SOCKET类 6 1、Socket套接字连接 6 2、Socket...
常用设计模式脑图,脑图中根据每个设计模式进行了详细的备注解释!我们的最强大脑在哪里?在这里!(单例模式、原型模式、工厂模式、代理模式、策略模式、适配器模式、委派模式、装饰器模式、观察者模式)