java的设计模式之工厂

设计模式是前人将一些类似的问题加以总结,从而衍生出的一系列的解决方案。我们在平时开发的过程中遇到类似的问题直接进行套用就可以了,这样极大的节省了我们的思考时间,所以设计模式还是要好好学习一下。并且很多java常用的开发框架也都是使用了各种各样的设计模式,学习设计模式也可以让我们更好的理解这些开发框架,从而我们也能写出类似的框架出来。

简单工厂模式

1. 目的 
        工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。它定义一个用于创建对象的接口,由子类决定实例化哪一个类。

2 . 简单工厂模式的结构

a、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
    b、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
    c、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

3. 一个简单例子
java 代码

// 产品接口         
public interface Product {   
  
    public void getName();   
  
}   
  
// 具体产品A   
public class ProductA implements Product {   
  
    public void getName() {   
        System.out.println("  I am ProductA  ");   
    }   
  
}   
  
// 具体产品B   
public class ProductB implements Product {   
  
    public void getName() {   
        System.out.println("  I am ProductB  ");   
    }   
  
}   
  
// 工厂类   
public class ProductCreator {   
  
    public Product createProduct(String type) {   
        if (" A ".equals(type)) {   
            return new ProductA();   
        }   
        if (" B ".equals(type)) {   
            return new ProductB();   
        } else  
            return null;   
    }   
  
    public static void main(String[] args) {   
        ProductCreator creator = new ProductCreator();   
        creator.createProduct(" A ").getName();   
        creator.createProduct(" B ").getName();   
    }   
}

4. 小结工厂模式的适用范围 
在编码时不能预见需要创建哪一种类的实例。 
一个类使用它的子类来创建对象。 
开发人员不希望创建了哪个类的实例以及如何创建实例的信息暴露给外部程序。  
 
抽象工厂模式 
1. 抽象工厂模式可以说是简单工厂模式的扩展,它们主要的区别在于需要创建对象的复杂程度上。 
在抽象工厂模式中,抽象产品可能是一个或多个,从而构成一个或多个产品族。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。 
2. 抽象工厂模式的结构

a、系统中有多个产品族,而系统一次只可能消费其中一族产品
     b、同属于同一个产品族的产品一起使用时。
           来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):
           抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
           具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
           抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
           具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

抽象工厂这块不太好理解,如果你是在不明白的话建议下载一些java视频教程来看下就会比较容易明白了。

3. 一个简单例子
java 代码

//  产品 Plant接口         
public interface Plant {   
}   
  
// 具体产品PlantA,PlantB   
public class PlantA implements Plant {   
  
    public PlantA() {   
        System.out.println(" create PlantA ! ");   
    }   
  
    public void doSomething() {   
        System.out.println("  PlantA do something  ");   
    }   
}   
  
public class PlantB implements Plant {   
    public PlantB() {   
        System.out.println(" create PlantB ! ");   
    }   
  
    public void doSomething() {   
        System.out.println("  PlantB do something  ");   
    }   
}   
  
// 产品 Fruit接口   
public interface Fruit {   
}   
  
// 具体产品FruitA,FruitB   
public class FruitA implements Fruit {   
    public FruitA() {   
        System.out.println(" create FruitA ! ");   
    }   
  
    public void doSomething() {   
        System.out.println("  FruitA do something  ");   
    }   
}   
  
public class FruitB implements Fruit {   
    public FruitB() {   
        System.out.println(" create FruitB ! ");   
    }   
  
    public void doSomething() {   
        System.out.println("  FruitB do something  ");   
    }   
}   
  
// 抽象工厂方法   
public interface AbstractFactory {   
    public Plant createPlant();   
  
    public Fruit createFruit();   
}   
  
// 具体工厂方法   
public class FactoryA implements AbstractFactory {   
    public Plant createPlant() {   
        return new PlantA();   
    }   
  
    public Fruit createFruit() {   
        return new FruitA();   
    }   
}   
  
public class FactoryB implements AbstractFactory {   
    public Plant createPlant() {   
        return new PlantB();   
    }   
  
    public Fruit createFruit() {   
        return new FruitB();   
    }   
}

4. 小结 
在以下情况下,应当考虑使用抽象工厂模式。 
  首先,一个系统应当不依赖于产品类实例被创立,组成,和表示的细节。这对于所有形态的工厂模式都是重要的。 
  其次,这个系统的产品有多于一个的产品族。 
  第三,同属于同一个产品族的产品是设计成在一起使用的。这一约束必须得在系统的设计中体现出来。 
  最后,不同的产品以一系列的接口的面貌出现,从而使系统不依赖于接口实现的细节。

  其中第二丶第三个条件是我们选用抽象工厂模式而非其它形态的工厂模式的关键性条件。

其实用过spring的同学肯定深有体会,我们将对象的创建过程全部交给spring来管理,而spring就是一个大工厂,我们需要什么样的对象,直接找spring拿就是了,极大的节省了开发中一些繁琐的步骤。

设计模式需要我们掌握其原理,做到手中无剑心中有剑即可。

如果对单例模式不了解的同学可以看下这篇博客

设计模式之单例模式:http://blog.csdn.net/savagegarden5/article/details/42237983

时间: 2024-11-07 08:19:21

java的设计模式之工厂的相关文章

java常用设计模式之 工厂模式

工厂模式: 定义 一个用于创建对象的接口,让子类决定实例化哪一个类. 一句话概括: 是一个类的实例化延迟到其子类.     适用于 以下情况: ①:当一个类 ,不知道它所必须创建的对象的类的时候. ②:当一个类,希望由它的子类来指定它所创建的对象的时候. ③:当类将创建对象的职责给多个帮助子类中的一个,并且希望将哪一个帮助子类是代理这一信息局部化的时候. 说明: ① Product :定义工厂方法所创建的对象的接口. ② ConcreteProduct:实现Product 接口. ③ Creat

Java常见设计模式之工厂模式

工厂模式在我们日常的应用中应当算是比较广泛的一种设计模式了.今天让我们一起来学习一下,工厂的设计模式. 工厂模式在<Java与模式>中分为三类:     1)简单工厂模式(Simple Factory):不利于产生系列产品:     2)工厂方法模式(Factory Method):又称为多形性工厂:     3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品:        这三种模式从上到下逐步抽象,并且更具一般性.         GOF

Java与设计模式-抽象工厂模式

首先说明,文章较长,保证你有耐心看完肯定能懂,没耐心直接点×即可. 抽象工厂模式,是创建型设计模式之一.抽象型工厂模式适合产品确定,产品线不确定的类型,怎么讲?通过一个具体例子来讲一下吧.例如某电脑厂商要生产电脑,也就是电脑这个产品确定,而电脑配置不确定,这种情况可以用抽象工厂模式来解决.类图如图所示: 代码实现完全结合UML类图,结合图就可以完成系统创建. 本实例里是抽象类ComputerFactory(对应UML类图中的AbstractFactory): package com.factor

java的设计模式 - 静态工厂方法

静态工厂方法,也不知道为何叫这个名字.其实也就是一个静态函数,可以替代构造函数用.大名鼎鼎的 guava 就大量使用这种模式,这是非常有用的模式. 比如是 Integer i = Integer.valueOf(123); Boolean bool = Boolean.valueOf(true); //guava 的方法 ConcurrentMap<String,Integer> concurrentMap = Maps.newConcurrentMap(); ArrayList<Int

java GOF23设计模式-简单工厂模式进阶

不修改已有代码,而是添加代码不和所有类打交道,只和总接口的实现类打交道public class Cilent { public static void main(String[] args) { Car c1=new AudiFactory().createCar(); Car c2=new ByadiFactory().createCar(); Car c3=new BenzFactory().createCar(); c1.run(); c2.run(); c3.run(); } } 接口:

java GOF23设计模式-简单工厂模式

public class CarFactory { //简单工厂模式1 public Car createCar(String type) { if(type.equals("奥迪")) { return new Audi(); }else if(type.equals("比亚迪")) { return new Byadi(); } return null; } //或简单工厂模式2 public static Car createAudi() { return n

浅析JAVA设计模式之工厂模式(一)

1 工厂模式简介 工厂模式的定义:简单地说,用来实例化对象,代替new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式可以动态决定将哪一个类实例化,不用先知道每次要实例化哪一个类. 工厂模式可以分一下三种形态: 简单工厂 (Simple Factory)模式:又称静态工厂模式(StaticFactory). 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory). 抽象工厂 (Abstract Factroy)模式:又称工具箱模式

浅析JAVA设计模式之工厂模式(二)

1 工厂方法模式简介 工厂方法 (Factroy Method) 模式:又称多态性工厂模式(Polymorphic Factory),在这种模式中,核心工厂不再是一个具体的类,而是一个抽象工厂,提供具体工厂实现的接口,具体创建产品交由子工厂去做,抽象工厂不涉及任何产品被实例化的细节.而不同等级的产品,就对应一个不同等级的工厂,如下图. 图1 1.1工厂方法模式(多态性工厂模式): 工厂方法模式有三个角色: 1. 抽象产品接口 2. 具体产品类 3. 抽象工厂接口 4.具体工厂类. 1.2工厂方法

浅析JAVA设计模式之工厂模式(三)

在阅读本文之前,请先阅读(一)和(二)中的简单工厂模式和工厂方法模式. 1抽象工厂模式简介 抽象工厂 (Abstract Factroy) 模式:工具箱模式(kit).抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态,如下图. 图1.1 上图左边有一个工厂类的等级结构,右边有两个不同的产品等级结构,分别是产品A的等级结构和产品B的等级结构,工厂1和工厂2分别负责不同一个产品等级,同一个产品族的产品的生产.又例如下图: 图1.2 上图表示的是Button和Text两个不同产品的等级