很久没有好好看书了, 空虚的很, 所以打算系统的学习一下设计模式, 为明年的论文做准备。 为了督促自己, 写此学习笔记。
学习贵在坚持, 听力贵在坚持, 锻炼身体贵在坚持, 所以, 做好任何事情都贵在坚持。
因为现在一直在用J#,所以所有源代码都用J#实现, 在VS2005环境中.
其实很多人听说我在用J#的时候, 第一个直接反映就是眼睛放大,然后追问为什么选择现在几乎没有人在用的J#? 其实这是老板决定的, 更进一步说是用Rose建模和选择比较纯粹的面向对象的Java语言决定了使用J#.用了这段时间感觉还可以.
设计模式的学习笔记已经有若干人做过了, 但是用J#做源码实现恐怕还不多吧!?
下面就开始介绍简单工厂模式
简单工厂模式又称静态工厂方法, 是类的创建模式。
问题:
为了提高内聚(Cohesion)和松散耦合(Coupling), 我们会经常抽象出一些类的公共接口以形成抽象基类和接口。简单工厂模式提供创建对象的接口,封装了对象的创建, 由工厂类根据传入的参数决定创建哪一种产品类。
类图:
源代码实现:
/**
* 工厂类
*/
public class Factory
{
// 静态工厂方法
public static Product createProduct(String productName)
throws BadProductException
{
if (productName.equalsIgnoreCase("ConcreteProduct1"))
return new ConcreteProduct1();
else if (productName.equalsIgnoreCase("ConcreteProduct2"))
return new ConcreteProduct2();
else
throw new BadProductException("/"" + productName + "/" is not a valid name of product!");
}
}
/**
* 产品接口
*/
public interface Product
{
void Operation1();
void Operation2();
}
/**
* 具体产品类ConcreteProduct1
*/
public class ConcreteProduct1 implements Product
{
private String attributeA;
public String Operation1()
{
return "Operation1";
}
public String Operation2()
{
return "Operation2";
}
public String getAttributeA()
{
return this.attributeA;
}
public void setAttributeA(String attributeA)
{
this.attributeA = attributeA;
}
}
/**
* 具体产品类ConcreteProduct2
*/
public class ConcreteProduct2 implements Product
{
private String attributeB;
public String Operation1()
{
return "Operation1";
}
public String Operation2()
{
return "Operation2";
}
public String getAttributeB()
{
return this.attributeB;
}
public void setAttributeB(String attributeB)
{
this.attributeB = attributeB;
}
}
/**
* 客户端代码
*/
try
{
Factory theFactory = new Factory();
Product aConcreteProduct1 = theFactory.createProduct("ConcreteProduct1");
lblMessagea.set_Text(ConcreteProduct1.Operation1());
缺点:
1) 增加新的具体产品类, 会导致工厂类的修改。功能扩展比较困难。
2)由于使用静态方法作为工厂方法,而静态方法无法由子类继承,因此,工厂角色无法形成基于继承的等级结构.
Product aConcreteProduct2 = theFactory.createProduct("ConcreteProduct2");
// 运行下一句时产生异常
Product aConcreteProduct3 = theFactory.createProduct("ConcreteProduct3");
}
catch(BadProductException ex)
{
lblMessage.set_Text(ex.get_Message());
}