工厂模式提供创建对象的接口。

工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).
GOF在《设计模式〉中将工厂模式分为两类:工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory)。

1. 简单工厂模式(Simple Factory)
简单工厂模式又叫做静态工厂方法模式。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
该模式中包含的角色及职责:
工厂(Creator)角色:它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需要的产品对象。
抽象产品角色:它负责描述所有实例所共有的公共接口。
具体产品角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

缺点:在工厂类中集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;对系统的维护和扩展不利;

使用场景:负责创建的对象比较少;客户只知道传入工厂类的参数,对于如何创建对象的逻辑不关心;容易违反高内聚责任分配原则,所以只在很简单的情况下应用;

类图:

实例:

//抽象产品角色
public interface IProduct
{
    public void saleProduct();
}
//具体产品角色
public class Product_A implements IProduct
{
    @Override
    public void saleProduct(){
        ...
    }

}
//具体产品角色
public class Product_B implements IProduct
{
    @Override
    public void saleProduct(){
        ...
    }

}
//工厂角色
public class Creator
{
    public IProduct createProduct(int productFlag){
        switch(productFlag){
            case 1:
                return new Product_A();
            case 2:
                return new Product_B();
            default:
                return null;
        }
    }
}

2. 工厂方法模式(Factory Method)
工厂方法模式是简单工厂方法模式的衍生,它的核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,使得系统可以在不修改具体工厂角色的情况下引用新的产品。
在这个模式中,一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品。
工厂方法模式是最典型的模板方法模式(Template Method Pattern)应用。

 

该模式中包含的角色及职责: 

 

抽象工厂(Creator)角色:工厂方法模式的核心,任何在模式中创建的对象的工厂必须实现这个接口。
具体工厂(Concrete Creator)角色:实现抽象工厂接口的具体工厂类,包含应用程序的逻辑。
抽象产品(Product)角色:产品对象的共同父类或共同拥有的接口。
具体产品(Concrete Product)角色:实现了抽象产品角色定义的接口,其具体产品有专门的具体工厂创建。

使用场景:
对于某个产品,调用者清楚知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来;
只是需要一种产品,对于那个工厂生产的并不关心,最终选用哪个具体工厂由生产者一方决定,它根据当前系统的情况来实例化一个具体的工厂返回给使用者,这个决策过程对于使用者来说是透明的。

类图:

 

实例:

//抽象工厂
public interface Creator{
       public Light factory();
}
//抽象产品
public interface Light{
    public void TurnOn();
    public void TrunOff();
}
//具体产品
public class BullbLight implements Light{
    public void TurnOn(){
    }

    public void TrunOff(){
    }
}
//具体产品
public class TubeLight implements Light{
    public void TurnOn(){
    }

    public void TrunOff(){
    }
}
//具体工厂
public class BullbCreator implements Creator{
       public Light factory(){
        return new BullbLight();
    }
}
//具体工厂
public class TubeCreator implements Creator{
       public Light factory(){
        return new TubeLight();
    }
}
public class Client{
       public static void main(String[] args){
              Creator create = new BullbCreator();
          Light bullbLight = create.factory();
          bullbLight.TurnOn();

              Creator create1 = new TubeCreator();
          Light tubebLight = create.factory();
          tubebLight.TurnOn();

       }
}

3. 抽象工厂模式(Abstract Factory)
抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。

类图:

实例:

//抽象工厂角色
public interface AbstractFactory{
  public ProductA createProductA();
  public ProductB createProductB();
}

//抽象产品类A
public interface AbstractProductA
{
}

//抽象产品类B
public interface AbstractProductB
{
}

//具体产品类ProdcutA1
public class ProductA1 implements AbstractProductA
{
  public ProductA1()
  {
  }
}

//具体产品类ProdcutA2
public class ProductA2 implements AbstractProductA
{
  public ProductA2()
  {
  }
}

//具体产品类ProductB1
public class ProductB1 implements AbstractProductB
{
  public ProductB1()
  {
  }
} 

//具体产品类ProductB2
public class ProductB2 implements AbstractProductB
{
  public ProductB2()
  {
  }
}

//具体工厂类1
public class ConcreteFactory1 implements AbstractFactory{
  public AbstractProductA createProductA(){
  return new ProductA1();
  }
  public AbstractProductB createProductB(){
  return new ProductB1();
    }
}

//具体工厂类2
public class ConcreteFactory2 implements Creator{
  public AbstractProductA createProductA(){
  return new ProductA2();
  }
  public AbstractProductB createProductB(){
  return new ProductB2();
  }
} 

java设计模式---三种工厂模式的更多相关文章

  1. java设计模式---三种工厂模式之间的区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  2. java设计模式三种工厂模式简单介绍

    一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...

  3. 设计模式—三种工厂模式(JAVA)

    一:简单工厂: 有一个实际工厂,这个工厂只能造一类的产品,这一类产品就是一个产品接口,会有多个具体产品实现这个接口,例 如,一个手机厂,生产苹果手机,三星手机: 缺点:在工厂类中集中了所有实例的创建逻 ...

  4. 深入理解Java的三种工厂模式

    一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 public interface Car { S ...

  5. Java的三种工厂模式

    一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 //产品接口 //汽车需要满足一定的标准 pub ...

  6. Java设计模式之三种工厂模式

    工厂模式实现了创建者和调用者的分离,实现了更好的解耦.   详细分类: 1) 简单工厂模式(静态工厂模式): 2) 工厂方法模式: 3) 抽象工厂模式 面向对象设计的基本原则: 1)       OC ...

  7. java设计模式(三)--抽象工厂模式

    转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...

  8. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  9. Java的三种代理模式

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

随机推荐

  1. SQL之排序

    1.按多个列排序 经常需要按不止一个列进行数据排序.例如,如果要显示雇员名单,可能希望按姓和名排序(首先按姓排序,然后在每个姓中再按名排序).如果多个雇员有相同的姓,这样做很有用. 要按多个列排序,简 ...

  2. Postgresql合并年月日、月份和日期左侧补零

    在写一个统计查询的 SQL 语句时,需要根据年.月.日分组,但要求返回的字段是日期格式:yyyy年MM月dd日.刚开始我的做法是返回年.月.日,然后再手动拼接年月日,而且还要判断月份和日期是否为个位数 ...

  3. Linux 在线模拟器

    最近在学习Linux的一些命令的使用,但是很久之前装的Linux虚拟机被删掉了,又不想为了练习几个命令折腾一遍虚拟机.所以,就尝试地搜了一下,看看有没有在线的Linux模拟器可以使用,只要可以练习一下 ...

  4. Mysql索引介绍及常见索引的区别

    关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...

  5. Hadoop系列:(一)hdfs文件系统的基本操作

    可以执行所有常用的Linux文件操作命令(读取文件,新建文件,移动文件,删除文件,列表文件等) 1.help命令获取没个命令的帮助 [cloudera@quickstart ~]$ hadoop fs ...

  6. CentOS6.8虚拟机安装及ORALCE安装记录

    CENTOS6.8安装数据库及设置自启动脚本教程 作者:张欣橙 本文所需要的所有参数均位于文末附录中 一.新建虚拟机 选择下一步 选择下一步 选择稍后安装操作系统 选择LINUX 版本 CentOS ...

  7. UDP网络编程

    概念: UDP协议(用户数据报协议)是无连接,不可靠的,无序的.速度比较快, UDP协议以数据报作为数据传输的载体 进行数据传输时,首先将传输的数据定义成数据报(Datagram),在数据报中指明数据 ...

  8. 转:Socket原理与编程基础

    from: http://acm.tzc.edu.cn/acmhome/projectList.do?method=projectNewsDetail&nid=2 一.Socket简介 Soc ...

  9. dephi FillChar 的几种写法

    //在 delphi 新版中, char 已经是双字节了.故应该重新自己写一个函数,取名为 FillByte ,才无歧义. procedure TForm1.Button2Click(Sender: ...

  10. ACM 最小公倍数

    给定两个正整数,计算这两个数的最小公倍数. Input 输入包含多组测试数据,每组只有一行,包括两个不大于1000的正整数.Output对于每个测试用例,给出这两个数的最小公倍数,每个实例输出一行.  ...