简单工厂模式,工厂方法模式,抽象工厂模式

原创 2013年12月03日 11:21:28

 Factory

、工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类:
1. 简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。下面是使用工厂模式的两种情况

1.在编码时不能预见需要创建哪种类的实例。
2.系统不应依赖于产品类实例如何被创建、组合和表达的细节

 

二、简单工厂模式
顾名思义,这个模式本身很简单,而且使用在业务较简单的情况下。
它由三种角色组成(关系见下面的类图):
1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。


   例如:我们要开一辆车在路上跑

package samplefactory;
//抽象产品
public interface Car {
    public void run();
}

 

package samplefactory;
//具体产品
public class Car1 implements Car {
    @Override
    public void run() {
        System.out.println("car1 is running");
    }
}

package samplefactory;

public class Car2 implements Car {
    @Override
    public void run() {
        System.out.println("car2 is running");
    }
}

//工厂
package samplefactory;
public class CarFactory {
    public Car getCar(String carType) {
        if ("car1".equals(carType)) {
            return new Car1();
        } else if ("car2".equals(carType)) {
            return new Car2();
        }
        return null;
    }
}

//测试

package samplefactory;
public class Test {
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        Car car = carFactory.getCar("car1");
        car.run();
    }

}

  分析: 它是符合开闭原则的--对扩展开放、对修改关闭;但是工厂部分好像不太理想,因为每增加一辆车,都要在工厂类中增加相应的商业逻辑和判断逻辑,这显自然是违背开闭原则的。

 

三、工厂方法模式
先来看下它的组成吧:
1、抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2、具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
3、抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4、具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
来用类图来清晰的表示下的它们之间的关系:


具体代码

package factorymethod;
//抽象产品
public interface Car {
   public void run();
}


package factorymethod;
//具体产品
public class Car1 implements Car {

    @Override
    public void run() {
        System.out.println("car1 is running");
    }
}

 

package factorymethod;
public class Car2 implements Car {
    @Override
    public void run() {
        System.out.println("car2 is running");
    }
}

 

package factorymethod;
// 抽象工厂
public interface Factory {
    public Car getCar();
}


package factorymethod;
public class Car1Factory implements Factory {
    @Override
    public Car getCar() {
        return new Car1();
    }
}


package factorymethod;
public class Car2Factory implements Factory {

    @Override
    public Car getCar() {
        return new Car2();
    }
}

 

package factorymethod;
public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
        //这里只需改变工厂,之后的代码不变
        Factory factory = new Car1Factory();
        Car car = factory.getCar();
        car.run();
    }
}

    让我们来看看工厂方法模式给我们带来了什么?使用开闭原则来分析下工厂方法模式。当有新的产品产生时,只要按照抽象产品角色、抽象工 厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。看来,工厂方法模式是完全符合开闭原则的!

       使用工厂方法模式足以应付我们可能遇到的大部分业务需求。但是当产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的。所以我建议 在这种情况下使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实 现。

当然特殊的情况,就要特殊对待了:对于系统中存在不同的产品树,而且产品树上存在产品族,那么这种情况下就可能可以使用抽象工厂模式了。

 

四:抽象工厂模式

      先来认识下什么是产品族:位于不同产品等级结构中,功能相关联的产品组成的家族。如果光看这句话就能清楚的理解这个概念,我不得不佩服你啊。还是让我们用一个例子来形象地说明一下吧。
     回到抽象产品模式的话题上,可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。而且使用抽象工厂模式还要满足一下条件:
1.系统中有多个产品族,而系统一次只可能消费其中一族产品
2.同属于同一个产品族的产品以其使用。
来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):
(1)抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
(2)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
(3)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。



 代码查看附近

  • 6fbe8d9e-f46d-37c4-937f-e9f866e6a494-thumb.jpg
  • 大小: 14.1 KB
  • b1f8ae61-66d8-3e3e-9884-b833084c72bb-thumb.png
  • 大小: 12.6 KB
  • 01317c3a-47f2-3fe3-9efb-da685e7cc3b3-thumb.png
  • 大小: 19.2 KB
  • 914537e2-4181-3aff-bc1f-725b25f8e8d1-thumb.png
  • 大小: 39.5 KB

简单工厂模式、工厂方法模式、抽象工厂模式 之间的对比

简单工厂模式、工厂方法模式、抽象工厂模式 之间的对比
  • u013761036
  • u013761036
  • 2016年06月23日 20:10
  • 1016

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

简单工厂模式(Simple Factory Pattern): 使用一个类(通常为单体)来创建实例;简单工厂模式也叫静态工厂方法模式(Static FactoryMethod Pattern). 工...
  • itpinpai
  • itpinpai
  • 2016年04月15日 18:30
  • 6731

Java设计模式—工厂方法模式&抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式。 通用类图如下:         在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;C...
  • qq_25827845
  • qq_25827845
  • 2016年09月11日 15:07
  • 4689

23种设计模式----创建型模式(工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式)

1.单例模式  单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自己实例化并向整个系统提供这个实例。   通用类图如下:      通用代码如下:public cl...
  • oChangWen
  • oChangWen
  • 2017年06月17日 21:37
  • 441

抽象工厂模式,工厂方法模式区别

抽象工厂模式 转载自:https://www.shiyanlou.com/courses/document/867 一、本节目标我们本节课程主要介绍【抽象工厂模式】的相关知识,将会涉及以下内容: ...
  • u011532367
  • u011532367
  • 2015年11月29日 12:50
  • 1283

iOS 简单工厂模式、抽象工厂模式~详解

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄 /**     注意:简单工厂模式示例代码下载地址, */ 一、简单工厂模式 1、简述 首先...
  • shihuboke
  • shihuboke
  • 2017年06月29日 17:59
  • 313

抽象工厂模式和工厂方法模式区别

首先来看看这两者的定义区别: 工厂模式:定义一个用于创建对象的借口,让子类决定实例化哪一个类 抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类        个...
  • liu88010988
  • liu88010988
  • 2016年03月04日 09:48
  • 3586

工厂方法模式VS简单工厂模式

One----简单工厂模式: 一,基本知识: (1)定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。(2)理...
  • qq_28055429
  • qq_28055429
  • 2016年06月10日 23:14
  • 1541

【设计模式】简单工厂模式与工厂方法模式详细解读

1.前言     设计模式,各具特色,今天在此总结一下常见模式中 简单工厂模式与工厂方法模式的区别与联系 2.两种模式概要    1. 简单工厂模式         对于简单工厂模式的介绍,请...
  • yudandan10
  • yudandan10
  • 2013年03月10日 15:09
  • 4753

简单工厂模式和工厂方法模式的区别

本文举了一个计算器的例子,该例子实现的功能是加减乘除的功能。 简单工厂模式:就是如何去实例化对象的问题,对于很容易变化的问题,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂。例子如下:pa...
  • abc709272013
  • abc709272013
  • 2016年09月24日 22:33
  • 1397
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单工厂模式,工厂方法模式,抽象工厂模式
举报原因:
原因补充:

(最多只允许输入30个字)