java设计模式(2)--工厂模式
工厂模式主要分成:简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)三种。
一、简单工厂模式:
简单工厂模式属于创建型模式,又称为静态工厂方法(StaticFactory Method)模式,它不属于23种GOF设计模式之一。
本质:选择创建哪一种产品类的实例。
该模式有以下角色:
(1)工厂(Creator)角色:它是简单工厂模式的核心,主要负责根据传入的参数,动态决定应该创建哪一个产品类的实例。
(2)抽象产品(Product)角色:它一般是具体产品继承的父类或者实现的接口。它负责描述所有实例所共有的公共接口。
(3)具体产品(Concrete Product)角色:工厂类所创建的对象就是此角色的实例。它负责实现具体的生产功能。
示例:示例:/** *抽象产品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进行修改添加,所以对于抽象工厂模式添加一个产品类是违反了开闭原则的。
优点:分离接口和实现;使得切换产品簇变得容易。
缺点:不容易扩展新的产品;容易造成类层次复杂。