工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。
工厂模式的形态
工厂模式主要用一下几种形态:
1:简单工厂(Simple Factory)。
2:工厂方法(Factory Method)。
3:抽象工厂(Abstract Factory)。

简单工厂(Simple Factory)
又叫静态工厂,是工厂模式三中状态中结构最为简单的。主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例。我们来看一个具体的例子:
假设一家工厂,几生产洗衣机,有生产冰箱,还有空调等等..
我们先为所有产品定义一个共同的产品接口

  1. public interface Product{}

接着我们让这个工厂的所有产品都必须实现此接口

  1. public class Washerimplements Product{
  2. public Washer(){
  3. System.out.println("洗衣机被制造了");
  4. }
  5. }
  6. public class Iceboximplements Product{
  7. public Icebox(){
  8. System.out.println("冰箱被制造了");
  9. }
  10. }
  11. public class AirConditionimplements Product{
  12. public Icebox(){
  13. System.out.println("空调被制造了");
  14. }
  15. }

接下来我们来写一个工厂类,有它来负责生产以上的产品

  1. public class SimpleFactory {
  2. public static Product factory(String productName)throws Exception{
  3. if(productName.equals("Washer")){
  4. return new Washer();
  5. }else if(productName.equals("Icebox")){
  6. return new Icebox();
  7. }else if(productName.equals("AirCondition")){
  8. return new AirCondition();
  9. }else{
  10. throw new Exception("没有该产品");
  11. }
  12. }
  13. }

好了,有了这个工厂类,我们就可以开始下定单了,SimpleFactory将根据不同的定单类决定生产什么产品。

  1. public staticvoid main(String[] args) {
  2. try {
  3. SimpleFactory.factory("Washer");
  4. SimpleFactory.factory("Icebox");
  5. SimpleFactory.factory("AirCondition");
  6. } catch (Exception e) {
  7. e.printStackTrace();
  8. }
  9. }

由上面的代码可以看出,简单工厂的核心就是一个SimpleFactory类,他拥有必要的逻辑判断能力和所有产品的创建权利,我们只需要向把定单给他,就能得到我们想要的产品。这使用起来似乎非常方便。
但,实际上,这个SimpleFactory有很多的局限。首先,我们每次想要增加一种新产品的时候,都必须修改SimpleFactory的原代码。其次,当我们拥有很多很多产品的时候,而且产品之间又存在复杂的层次关系的时候,这个类必须拥有复杂的逻辑判断能力,其代码量也将不断地激增,这对以后的维护简直就是恐怖两个字...
还有就是,整个系统都严重依赖SimpleFactory类,只要SimpleFactory类一出问题,系统就进入不能工作的状态,这也是最为致命的一点....
以上的不足将在工厂模式的另外两种状态中得到解决。

工厂方法(Factory Method)
上面的代码告诉我们,简单工厂并不简单,它是整个模式的核心,一旦他出了问题,整个模式都将受影响而不能工作,为了降低风险和为日后的维护、扩展做准备,我们需要对它进行重构,引入工厂方法。
工厂方法为工厂类定义了接口,用多态来削弱了工厂类的职能,以下是工厂接口的定义:

  1. public interface Factory{
  2. public Product create();
  3. }

我们再来定义一个产品接口

  1. public interface Product{}

一下是实现了产品接口的产品类

  1. public class Washerimplements Product{
  2. public Washer(){
  3. System.out.println("洗衣机被制造了");
  4. }
  5. }
  6. public class Iceboximplements Product{
  7. public Icebox(){
  8. System.out.println("冰箱被制造了");
  9. }
  10. }
  11. public class AirConditionimplements Product{
  12. public Icebox(){
  13. System.out.println("空调被制造了");
  14. }
  15. }

接下来,就是工厂方法的核心部分,也就是具体创建产品对象的具体工厂类,

  1. //创建洗衣机的工厂
  2. public class CreateWasherimplements Factory{
  3. public Product create(){
  4. return new Washer();
  5. }
  6. }
  7. //创建冰箱的工厂
  8. public class CreateIceboximplements Factory{
  9. public Product create(){
  10. return new Icebox();
  11. }
  12. }
  13. //创建空调的工厂
  14. public class CreateAirConditionimplements Factory{
  15. public Product create(){
  16. return new AirCondition();
  17. }
  18. }

从上面创建产品对象的代码可以看出,工厂方法和简单工厂的主要区别是,简单工厂是把创建产品的职能都放在一个类里面,而工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面,这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。但工厂方法也有他局限的地方,那就是当面对的产品有复杂的等级结构的时候,例如,工厂除了生产家电外产品,还生产手机产品,这样一来家电是手机就是两大产品家族了,这两大家族下面包含了数量众多的产品,每个产品又有多个型号,这样就形成了一个复杂的产品树了。如果用工厂方法来设计这个产品家族系统,就必须为每个型号的产品创建一个对应的工厂类,当有数百种甚至上千种产品的时候,也必须要有对应的上百成千个工厂类,这就出现了传说的类爆炸,对于以后的维护来说,简直就是一场灾难.....

抽象工厂(Factory Method)
抽象工厂:意的意图在于创建一系列互相关联或互相依赖的对象。<<Java设计模式>>
我自己觉得抽象工厂是在工厂方法的基础上引进了分类管理的概念....
工厂方法用来创建一个产品,它没有分类的概念,而抽象工厂则用于创建一系列产品,所以产品分类成了抽象工厂的重点,
我们继续用上面的例子来说明:
工厂生产的所有产品都用都用大写字母来标明它们的型号,比如冰箱,就有“冰箱-A",“冰箱-B",同样,其他的产品也都是遵守这个编号规则,于是就有了一下产品家族树

冰箱:

  1. 冰箱-A
  2. 冰箱-B

洗衣机:

  1. 洗衣机-A
  2. 洗衣机-B

我们可以为冰箱和洗衣机分别定义两个产品接口,以对他们进行分类,

  1. //洗衣机接口
  2. public interface Washer{
  3. }
  4. //冰箱接口
  5. public interface Icebox{
  6. }

接着,我们分别创建这两个接口的具体产品

  1. //洗衣机-A
  2. public class WasherAimplements Washer{
  3. public WasherA(){
  4. System.out.println("洗衣机-A被制造了");
  5. }
  6. }
  7. //洗衣机-B
  8. public class WasherBimplements Washer{
  9. public WasherB(){
  10. System.out.println("洗衣机-B被制造了");
  11. }
  12. }
  13. //冰箱-A
  14. public class IceboxAimplements Icebox{
  15. public IceboxA(){
  16. System.out.println("冰箱-A被制造了");
  17. }
  18. }
  19. //冰箱-B
  20. public class IceboxBimplements Icebox{
  21. public IceboxB(){
  22. System.out.println("冰箱-B被制造了");
  23. }
  24. }

到此,产品部分我们准备好了,接下来我们来处理工厂部分,我们先来定义工厂行为接口

  1. public interface Factory{
  2. public Washer createWasher();
  3. public Icebox createIcebox();
  4. }

接下来我创造具体的工厂类,我们根据上面产品的接口,把型号A的产品分为一类,由一个工厂来管理,把型号为B的产品有另一个工厂管理,根据这个分类,我们可以实现如下的两个具体工厂类

  1. //创建型号为A的产品工厂
  2. public class FactoryAimplements Factory{
  3. //创建洗衣机-A
  4. public Washer createWasher(){
  5. return new WasherA();
  6. }
  7. //创建冰箱-A
  8. public Icebox createIcebox(){
  9. return new IceboxA();
  10. }
  11. }
  12. //创建型号为B的产品工厂
  13. public class FactoryBimplements Factory{
  14. //创建洗衣机-B
  15. public Washer createWasher(){
  16. return new WasherB();
  17. }
  18. //创建冰箱-B
  19. public Icebox createIcebox(){
  20. return new IceboxB();
  21. }
  22. }

这样,我们的抽象工厂就完成了。有上面可以看出,在运用上我觉得工厂方法和抽象工厂,都有自己的应用场景,并没有什么优劣之分,但在应用抽象工厂之前,要先对创建的对象进行系统的分类,这点很重要,好的产品分类规则能为具体工厂类的选择调用和以后的扩展提供清晰的思路.

Java设计模式——工厂设计模式的更多相关文章

  1. java简单工厂设计模式

    一.基本定义 /* *简单工厂设计模式: *文字描述理解: * 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式. * 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常 * 都具有共同 ...

  2. Java设计模式—工厂设计模式

    工厂设计模式(减少耦合.通过接口或者工厂类来实现) 耦合性:粘度强(依耐性) Person p = new Person();  //耦合性强              Man p = new Per ...

  3. php设计模式-工厂设计模式

    概念: 工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤. 很多高级模式都是依赖于工厂模式.

  4. java设计模式------工厂设计模式

    总结 以上就是工厂模式的基本实现和详细说明.包括了简单工厂模式.工厂方法模式.抽象工厂模式.我们可以基于需求来选择合适的工厂模式 基本概念:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来 ...

  5. 【51】java设计模式-工厂设计模式剖析

    工厂设计设计模式的分类: 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method) ...

  6. Java基础-工厂设计模式(三锅的肥鸡)

    ---恢复内容开始---   1)还没有工厂时代:假如还没有工业革命,如果一个你要一架飞机,一般的做法是自己去建造一架飞机,然后拿来开 通常的结果就是 有些时候 要么专科螺钉 没打好  要么就是 那个 ...

  7. Java基础面试操作题:Java代理工厂设计模式 ProxyFactory 有一个Baby类,有Cry行为,Baby可以配一个保姆 但是作为保姆必须遵守保姆协议:能够处理Baby类Cry的行为,如喂奶、哄睡觉。

    package com.swift; public class Baby_Baomu_ProxyFactory_Test { public static void main(String[] args ...

  8. 10.Java设计模式 工厂模式,单例模式

    Java 之工厂方法和抽象工厂模式 1. 概念 工厂方法:一抽象产品类派生出多个具体产品类:一抽象工厂类派生出多个具体工厂类:每个具体工厂类只能创建一个具体产品类的实例. 即定义一个创建对象的接口(即 ...

  9. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

随机推荐

  1. Qt学习虚拟机--基于MSYS2-MinGW环境并带有各种开源的软件库!

    Qt学习虚拟机--基于MSYS2-MinGW环境并带有各种开源的软件库!虚拟机地址,VM10和以上:http://pan.baidu.com/s/1slcTA49包含两个分卷压缩包,加起来5GB多. ...

  2. 可视化流程设计——流程设计器演示(基于Silverlight)

    上一篇文章<通用流程设计>对鄙人写的通用流程做了一定的介绍,并奉上了相关源码.但一个好的流程设计必少不了流程设计器的支持,本文将针对<通用流程设计>中的流程的设计器做一个简单的 ...

  3. web的seo

    摘要:搜索引擎优化是一种具有很高技术性的活动,也是一种营销功能,必须将它作为营销活动处理.SEO从业者必须理解公司的服务.产品.总体业务战略.竞争形势.品牌.未来网站开发目标和相关的业务构成. SEO ...

  4. vue+element——父级元素fixed,遮罩会在上方

    前言 这种场景还是蛮场景的 一个共用的head组件,组件里面通常是当前系统登录账号名 退出登录 修改密码这样的弹框 但是现在我又想head不跟着main内容上下滑动.所以用了fixed 定位. 问题来 ...

  5. 9个WebGL的演示

    1.  WebGL Water This incredible demo is as fluid as you could believe.  Raise and drop the ball into ...

  6. git push 时 failed to push some refs 的解决方案

    我们在利用 GIt 上传代码的时候,往往会遇到这样一个问题,导致我们的代码没有办法正常上传到仓库中 造成这个问题的原因其实很简单,就是因为远程仓库和本地库不一致. 基于这样的一个问题,解决办法自然也就 ...

  7. 戏说 .NET GDI+系列学习教程(一、Graphics类--纸)

    Graphics类(纸) Graphics类封装一个GDI+绘图图面,提供将对象绘制到显示设备的方法,Graphics与特定的设备上下文关联. 画图方法都被包括在Graphics类中,在画任何对象时, ...

  8. C++学习笔记 之 运算符

    用来执行特定的数字或逻辑操作,C++主要提供的运算符如下: 算数运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 算数运算符: 主要运算符:+(加).-(减) .*(乘) ./(除) ...

  9. vue 跨域请求,后端cookie session取不到

    虽然后端设置了可以跨域请求,但是后台设置到cookie中的session取不到!这时候mac电脑自己设置nginx代理! mac电脑系统重装了,记录一下安装nginx的过程: 1.打开终端(cmd) ...

  10. C#中的委托和事件(上篇)

    每一个初学C#的程序猿,在刚刚碰到委托和事件的概念时,估计都是望而却步,茫然摸不到头脑的.百度一搜,关于概念介绍的文章大把大把的,当然也不乏深入浅出的好文章.可看完这些文章,大多数新手,估计也只是信心 ...