问题:
简单工厂模式又称静态工厂方法,是类的创建模式。
为了提高内聚(Cohesion)和松散耦合(Coupling),我们会经常抽象出一些类的公共接口以形成抽象基类和接口。简单工厂模式提供创建对象的接口,封装了对象的创建,由工厂类根据传入的参数决定创建哪一种产品类。
类图:
源代码实现:
/** 工厂类*/
public class Factory{
// 静态工厂方法
public static Product createProduct(String productName)
throws BadProductException{
if (productName.equalsIgnoreCase("ConcreteProduct1")){
returnnewConcreteProduct1();
}else if (productName.equalsIgnoreCase("ConcreteProduct2")){
returnnewConcreteProduct2();
}else{
thrownewBadProductException("/"" + productName +"/" is not a valid name of product!");
}
}
}
/** 产品接口*/
publicinterfaceProduct{
void Operation1();
void Operation2();
}
/**具体产品类ConcreteProduct1*/
publicclassConcreteProduct1implementsProduct{
privateString attributeA;
publicString Operation1(){
return"Operation1";
}
publicString Operation2(){
return"Operation2";
}
publicString getAttributeA(){
returnthis.attributeA;
}
publicvoid setAttributeA(String attributeA){
this.attributeA = attributeA;
}
}
/** 具体产品类ConcreteProduct2*/
publicclassConcreteProduct2implementsProduct{
privateString attributeB;
publicString Operation1() {
return"Operation1";
}
publicString Operation2(){
return"Operation2";
}
publicString getAttributeB() {
returnthis.attributeB;
}
publicvoid setAttributeB(String attributeB){
this.attributeB = attributeB;
}
}
/**客户端代码*/
public class Client{
public static void main(String[] args){
try{
Factory theFactory =newFactory();
Product aConcreteProduct1 = theFactory.createProduct("ConcreteProduct1");
lblMessagea.set_Text(ConcreteProduct1.Operation1());
Product aConcreteProduct2 = theFactory.createProduct("ConcreteProduct2");
// 运行下一句时产生异常
Product aConcreteProduct3 = theFactory.createProduct("ConcreteProduct3");
} catch(BadProductException ex){
lblMessage.set_Text(ex.get_Message());
}
}
}
缺点:
1) 增加新的具体产品类, 会导致工厂类的修改。功能扩展比较困难。
2)由于使用静态方法作为工厂方法,而静态方法无法由子类继承,因此,工厂角色无法形成基于继承的等级结构。