标签:
1、静态工厂
客户决定生产的产品类型,而不需要关心细节。
结构:
1)抽象产品角色 一般采用接口抽象出产品的共性
2)具体产品角色 实现接口
3)静态工厂角色 生产具体产品
示例:
interface Car //抽象产品角色
{
void run();
}
class Benz implements Car //具体产品角色
{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("benz is running");
}
}
class Ford implements Car //具体产品角色
{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("ford is running");
}
}
class CarFactory //静态工厂模式
{
public static Car produce(String name)
{
try {
return (Car)Class.forName(name).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
public static void main(String[] args) {
Car car=CarFactory.produce("Benz");
car.run();
Car car2=CarFactory.produce("Ford");
car2.run();
}优点:
优点:
通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利。(简单地说,你到肯德基去只需要说你要鸡腿还是鸡翅就行了,不需要去管鸡腿和鸡翅是怎么做出来的,工厂为你提供了这样一个界面)
不足:
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新
的类,则就需要改变工厂类了。当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
使用场景:
工厂类负责创建的对象比较少;客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。从上面的例子也可以看出来,工厂类往往是用反射机制来产生具体对象的。(因为不同类都继承自同一接口),故其扩展性很有限,产品种类必须是事先就知道的哪几种,什么时候你想要添加一个不是公共接口下的具体类就不行了。另外,如果你不用反射机制,也不要公共接口,在工厂中使用其他逻辑(例如判断传入的字符串)来根据用户参数创建对象也行,那样扩展性也是很糟糕的,逻辑和添加只会越来多。
2、动态(抽象)工厂
与静态工厂模式相比,抽象工厂,将工厂变成了抽象工厂和具体工厂,每个工厂生产具体的产品,结构如下:
1)抽象产品
2)具体产品
3)抽象工厂
4)具体工厂
示例:
interface Car //抽象产品 { void run(); } class Benz implements Car //具体产品 { @Override public void run() { // TODO Auto-generated method stub System.out.println("benz is running"); } } class Ford implements Car //具体产品 { @Override public void run() { // TODO Auto-generated method stub System.out.println("ford is running"); } } interface Factory //抽象工厂 { Car produce(String name); } class BenzFactory implements Factory //具体工厂 { @Override public Car produce(String name) { // TODO Auto-generated method stub return new Benz(); } } class FordFactory implements Factory //具体工厂 { @Override public Car produce(String name) { // TODO Auto-generated method stub return new Ford(); } }
优点:将生产产品的功能从之前的Factory分离出来,成为独立的生产具体产品的Factory实现类。
标签:
原文地址:http://www.cnblogs.com/maydow/p/4833357.html