Java 设计模式:简单Factory
简单工厂模式就是一个工厂类根据传入的参数决定创建出哪一种产品类的实例
简单工厂模式涉及到工厂角色,抽象产品角色,产品具体角色如下:
1、工厂类角色(Creator):担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑,工厂类在客户端的直接调用下创建产品对象,它往往有一个具体类实现
2、抽象产品角色(Product):担任这个角色的类是由工厂方法模式所创建的对象的父类,或他们共同拥有的接口。抽象产品 角色可以用一个java接口或是java抽象类实现
3、具体产品角色(ConcreteProduct):工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体java类实现。
简单工厂模式优点:
含有必要的判断逻辑,决定什么时候创建哪一个产品的实例,而客户端可以免除直接创建产品对象的责任,而仅仅消费产品,可以对实现责任的分割。
简单工厂模式缺点:
对于消费角色来说,只需向工厂申请产品对象即可,但对于工厂角色来说,每增加一种产品都需要修改工厂角色的实现代码。
代码如下:
//工厂类,在JCreator+jdk 1.4 中已经测试通过 class Creator { /** *静态工厂方法,根据不同的需求,产生不同的产品对象 */ public static Product factory(String type) { System.out.println("The factory is Generating Product ***** "+ type); if(type.equals("A")) return new ConcreteProductA(); else if(type.equals("B")) return new ConcreteProductB(); else return new ConcreteProductC(); } }; //抽象产品可以是接口,也可以是抽象类 interface Product { void ProductProperty();//产品的接口函数 }; //具体产品类A class ConcreteProductA implements Product { public ConcreteProductA(){};//产品的构造函数 public void ProductProperty()//接口函数 { System.out.println("This is a ConcreteProductA object!"); } }; //具体产品类B class ConcreteProductB implements Product { public ConcreteProductB(){};//产品的构造函数 public void ProductProperty()//接口函数 { System.out.println("This is a ConcreteProductB object!"); } }; //具体产品类C class ConcreteProductC implements Product { public ConcreteProductC(){};//产品的构造函数 public void ProductProperty()//接口函数 { System.out.println("This is a ConcreteProductC object!"); } }; //测试类 public class factory { public static void main(String[] args) { Product obj1 = Creator.factory("A");//产品A Product obj2 = Creator.factory("B");//产品B Product obj3 = Creator.factory("C");//产品C Product obj4 = Creator.factory("XX");//还是产品C,产品C是类工厂的缺省产品 //测试产品 System.out.println("obj1 is starting :"); obj1.ProductProperty(); System.out.println("obj2 is starting :"); obj2.ProductProperty(); System.out.println("obj3 is starting :"); obj3.ProductProperty(); System.out.println("obj4 is starting :"); obj4.ProductProperty(); } }
消除工厂模式的固有缺陷,使用Java的反射机制
具体方法:修改工厂方法,以产品类的名称字符串参数
//工厂类
class CreatorEx
{
/**
*静态工厂方法,根据不同的需求,产生不同的产品对象
*/
public static Product factory(String type)
{
Product obj = null;
try
{
Class product = Class.forName(type);
obj = (Product)product.newInstance();
}
catch(Exception e)
{
e.printStackTrace();
return obj;
}
return obj;
}
};
//抽象产品可以是接口,也可以是抽象类
interface Product
{
void ProductProperty();//产品的接口函数
};
//具体产品类A
class ConcreteProductA implements Product
{
public ConcreteProductA(){};//产品的构造函数
public void ProductProperty()//接口函数
{
System.out.println("This is a ConcreteProductA object!");
}
};
//具体产品类B
class ConcreteProductB implements Product
{
public ConcreteProductB(){};//产品的构造函数
public void ProductProperty()//接口函数
{
System.out.println("This is a ConcreteProductB object!");
}
};
//具体产品类C
class ConcreteProductC implements Product
{
public ConcreteProductC(){};//产品的构造函数
public void ProductProperty()//接口函数
{
System.out.println("This is a ConcreteProductC object!");
}
};
//测试类
public class FactoryEx
{
public static void main(String[] args)
{
Product obj1 = CreatorEx.factory("ConcreteProductA");//产品A
Product obj2 = CreatorEx.factory("ConcreteProductB");//产品B
Product obj3 = CreatorEx.factory("ConcreteProductC");//产品C
//测试产品
System.out.println("obj1 is starting :");
obj1.ProductProperty();
System.out.println("obj2 is starting :");
obj2.ProductProperty();
System.out.println("obj3 is starting :");
obj3.ProductProperty();
}
}