`
v5browser
  • 浏览: 1146895 次
社区版块
存档分类
最新评论

Java常用设计模式详解(一)---工厂模式

 
阅读更多

设计模式的原则:针对借口编程

工厂模式的作用:

A.应用程序的设计中把对象的的创建集中在一个地方创建或者统一由某类来管理(spring)

B.在不改动应用程序的基础上可以直接添加对象,同时也利于对象的维护。

工厂模式的种类:

A.简单工厂

B.工厂方法

C.抽象工厂

楔子:

话说东北某老板家里有三辆车,奔驰,宝马,蓝博基尼,雇了一名有经验的司机,不同的场合他会吩咐司机开不同的车应酬。

简单工厂:

abstruact:

package com.product.abstruct;

public interface Car {

public void drive();//车是用来开的,所以得有个发动机
}

implements:

package com.product.implement;

import com.product.abstruct.Car;

public class Audi implements Car {

public void drive(){//宝马他也是车不是马,也得有发动机
// TODO Auto-generated method stub
System.out.println("yes,today wo are driving Audi。。。。");
}
}

package com.product.implement;

import com.product.abstruct.Car;

public class Benz implements Car {

public void drive(){//奥迪他也是车不是迪奥,也得有发动机
// TODO Auto-generated method stub
System.out.println("yes,today wo are driving Benz。。。。");
System.out.println("老板,一些按照您的吩咐....");
}

}

======兰博基尼省======

Factory类:

factory类是一个管理类,是汽车的直接负责人,这个人就是老板的司机;

package com.product.factory;
import com.product.abstruct.Car;
import com.product.implement.Audi;
import com.product.implement.Benz;

public class Driver {
public static Car driveCar(String carName) throws Exception{
if(carName.equalsIgnoreCase("Benz")){
return new Benz();
}
if(carName.equalsIgnoreCase("bmw")){
return new Bwm();
}
return new Audi();
}
}

某一天老板要去英格兰观看利物浦主场对阵维拉的比赛,需要开宝马去机场,于是把司机叫来,让他下午2点开宝马来接他。。。

package com.product.test;
import com.product.abstruct.Car;
import com.product.factory.Driver;

public class Test {
public static void main(String[] args) throws Exception{
//tell the driver which car wo drive todaty wo will to Amsterdam
Car car = Driver.driveCar("Benz");//让司机开车过来接
//Mrs wang go
car.drive();//一键启动
}

}


工厂方法:

随着老板的生意越做越大,越来越有钱,于是乎他有买了几辆跑车----法拉利、保时捷、捷豹三部座驾,由于车两增加了,所有的汽车都要有老司机一个人管理,年检、保险、罚单、洗车,老司机一个人实在吃不消,而且老板会吩咐老司机从周一到周六要开不同款式的车外出,这个时候老司机就不得不记住老板哪天需要开哪辆车外出,于是乎给老板提议:给每台车都聘请一个司机,每辆汽车都有一个专门的人员负责,需要外出的时候招呼我一声,我就会派相应的人员过来接老板,老板毫不犹豫的说:就这么办.......

抽象汽车类:

package com.product.car.abstruct;

public interface Car {

public void drive();
}

奥迪汽车:

package com.product.car.implement;
import com.product.car.abstruct.Car;

public class AudiDriver implements Car {

public void drive() {

System.out.println("想当官四个圈");

}
}

奔驰汽车:

package com.product.car.implement;
import com.product.car.abstruct.Car;

public class AudiDriver implements Car {

public void drive() {

System.out.println("想当官四个圈");

}
}

======省略其他汽车======

汽车总管(老司机)

package com.product.car.manager;
import com.product.car.abstruct.Car;

public interface CarManager {

public Car driveCar();

}

新招聘的奥迪司机:

package com.product.car.managerImpl;
import com.product.car.abstruct.Car;
import com.product.car.implement.AudiDriver;
import com.product.car.manager.CarManager;

public class AudiManager implements CarManager {

public Car driveCar() {

return new AudiDriver();

}
}

新招聘的奔驰司机:

package com.product.car.managerImpl;
import com.product.car.abstruct.Car;
import com.product.car.implement.BenzDriver;
import com.product.car.manager.CarManager;

public class BenzManager implements CarManager {

public Car driveCar(){

return new BenzDriver();

}
}

某天老板想去利物浦:

package com.product.test;
import com.product.car.abstruct.Car;
import com.product.car.implement.BenzDriver;
import com.product.car.manager.CarManager;

public class Test {

public static void main(String[] args) throws Exception{
//找到汽车主管,告诉他今天我想开宝马去看利物浦对阵维拉的比赛
CarManager carManager = (CarManager) new BenzDriver();
//负责宝马汽车的司机接到管家的电话,给宝马加满油,宝马来喽
Car driveCar = carManager.driveCar();
//飞奔利物浦
driveCar.drive();
}
}


以上就是工厂模式中的简单工厂,工厂方法,先来比较一下这两种模式的却别以及各自的优势所在,

程序设计角度:

a.简单工厂没有抽象类,只有一个工厂类,把需要创建对象的参数传递过来,由工厂类统一创建

b.定义一个创建产品对象的接口,该接口扮演这核心的角色,他只需要定义子类必须实现的方法即可,将对象交给对象本身来创建

优势劣势:

a.相对简单工厂工厂方法要更加的抽象,这样做的好处在于不改变工厂角色的基础上(不辞退老司机或者给他调岗)可以很轻松的增加新的成员(招聘更多的司机);

b.简单工厂的优势在于简单,仅仅是根据参数来创建相应对象即可,但劣势也相当明显,所有的对象都集中在该类中创建,所创建的对象只能是事先就知道的(忽然有一天老板买来一辆手动挡捷达,老板就必须通知老司机,我买了一辆捷达,在X放着);成员对象的添加会引起核心类增加方法,违反高内聚,当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

接下来时工厂模式的应用,程序设计中我们如何合理的应用工厂设计模式呢

  a.对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。

 b.只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的

分享到:
评论

相关推荐

    Jjava常用设计模式

    Java常用的设计模式详解,包含: 1、单例模式 2、工厂模式 3、策略模式 4、观察者模式 等等模式……

    Java 之23种设计模式解析

    java之23中常用设计模式详解 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    Java开发详解.zip

    031114_【第11章:Java常用类库】_观察者设计模式笔记.pdf 031115_【第11章:Java常用类库】_正则表达式笔记.pdf 031116_【第11章:Java常用类库】_定时调度笔记.pdf 031201_【第12章:JAVA IO】_File类笔记.pdf ...

    java设计模式

    工厂模式,单例模式详解工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,

    Java基础知识点总结.docx

    无论是工作学习,不断的总结是必不可少的。只有不断的总结,发现问题,弥补不足,才能长久的...java.util.concurrent.locks包下常用的类 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java 性能优化 362

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    java面试题目与技巧1

    基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt)....

    java面试题及技巧4

    基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt)....

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    javascript设计模式之对象工厂函数与构造函数详解

    下面通过文字详解加代码分析的方式给大家分享下javascript设计模式之对象工厂函数与构造函数的相关知识。 概述使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法。然而,除了这两种常用...

    java面试题以及技巧

    基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt)....

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    Spring高级之注解驱动开发视频教程

    n 设计模式-工厂模式 n 基础应用-入门案例 n 基础应用-常用注解使用场景介绍及入门 n 高级特性-自定义BeanNameGenerator n 高级特性-自定义TypeFilter n 高级特性-ImportSelector和ImportBeanDefinitionRegistrar的...

    Java Web程序设计教程

    5.1.2mvc设计模式 81 5.1.3struts2框架的mvc架构 82 5.2struts2概览 84 5.2.1struts2的工作流程 84 5.2.2struts2的简单应用 85 5.3struts2基础 87 5.3.1action详解 88 5.3.2结果与视图 91 5.3.3struts.xml的...

    java面试题及技巧3

    基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt)....

    java面试题以及技巧6

    基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt)....

    Java_JDBC由浅入深

    第七节 DAO设计模式详解 41 7.1 实际项目中如何使用JDBC 41 7.2 DAO设计模式简介 42 7.3 DAO设计模式的实现 42 7.4 DAO设计模式与工厂模式的整合 49 7.5 DAO设计模式测试 52 第八节 JDBC对事务的支持 52 8.1 模拟...

Global site tag (gtag.js) - Google Analytics