读书人

java设计方式(2)-工厂模式

发布时间: 2012-11-10 10:48:51 作者: rapoo

java设计模式(2)--工厂模式
工厂模式主要分成:简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)三种。

一、简单工厂模式:

简单工厂模式属于创建型模式,又称为静态工厂方法(StaticFactory Method)模式,它不属于23种GOF设计模式之一

本质:选择创建哪一种产品类的实例。

该模式有以下角色:

(1)工厂(Creator)角色:它是简单工厂模式的核心,主要负责根据传入的参数,动态决定应该创建哪一个产品类的实例。

(2)抽象产品(Product)角色:它一般是具体产品继承的父类或者实现的接口。它负责描述所有实例所共有的公共接口。

(3)具体产品(Concrete Product)角色:工厂类所创建的对象就是此角色的实例。它负责实现具体的生产功能。

java设计方式(2)-工厂模式

示例:

示例:

示例:

/** *抽象产品A类 */public interface IProductA {//1.1 定义产品A的方法接口public void printA();}/** *抽象产品B类 */public interface IProductB {    //1.2 定义产品B的方法接口    public void printB();}/** *具体产品A1类 */public class ProductA1 implements IProductA {    //2.1.1 产品A1的具体实现    public void printA() {        System.out.print("This is productA1.");    }}/** *具体产品A2类 */public class ProductA2 implements IProductA {    //2.1.2 产品A1的具体实现    public void printA() {        System.out.print("This is productA2.");    }}/** *具体产品B1类 */public class ProductB1 implements IProductB {    //2.2.1  产品B1的具体实现    public void printB() {        System.out.print("This is productB1.");    }}/** *具体产品B2类 */public class ProductB2 implements IProductB {    //2.2.2  产品B2的具体实现    public void printB() {        System.out.print("This is productB2.");    }}/** * 抽象工厂 */public interface Creator {    //3. 提供客户调用的工厂方法    public IProductA createProductA();        public IProductB createProductB();}/** * 具体工厂类:专门生产型号1的产品 */public class Creator1 implements Creator {    //4.1 具体创建实例的方法    public IProductA createProductA() {        return new ProductA1();    }           public IProductB createProductB() {        return new ProductB1();    }}/** * 具体工厂类:专门生产型号2的产品 */public class Creator2 implements Creator {    //4.2 具体创建实例的方法    public IProductA createProductA() {        return new ProductA2();    }    public IProductB createProductB() {        return new ProductB2();    }}/***主程序*/public class main {        public static void main(String []args)    {         Creator creator1 = new Creator1(); //实例化型号1的工厂         IProductA productA1 = creator1.createProductA(); //生产类型A、型号1的产品A1         productA1.printA();            creator1 = new Creator1();  //实例化型号1的工厂                  IProductB productB1 = creator1.createProductB();  //生产类型B、型号1的产品B1         productB1.printB();                  Creator creator2 = new Creator2(); //实例化型号2的工厂         productA1 = creator2.createProductA(); //生产类型A、型号2的产品A2         productA1.printA();                  creator2 = new Creator2();         productB1 = creator2.createProductB();         productB1.printB();             }}
运行结果:This is productA1. This is productB1. This is productA2. This is productB2.

Note:我们先了解下以下两个词概念:产品类和产品类族。

(1)产品类:如上示例中,ProductA和ProductB属于不同的产品类。

(2)产品类族:如上示例中,ProductA1和ProductA2、ProductB1和ProductB2分别属于同一产品类族。

当我们需要添加一个产品类族时,如ProductA3,我们只需要增加一个具体的产品类ProductA3和一个具体的工厂类Creator3,不必对其它的类或接口进行修改,所以是遵循开闭原则的。而当我们需要添加一个产品类时,如ProductC,我们不仅需要添加一个抽象产品类IProductC、具体产品类ProductC1,还需要对抽象工厂Creator、具体工厂Creator1、Creator2进行修改添加,所以对于抽象工厂模式添加一个产品类是违反了开闭原则的。

优点:分离接口和实现;使得切换产品簇变得容易。

缺点:不容易扩展新的产品;容易造成类层次复杂。

读书人网 >软件开发

热点推荐