Java 设计模式(2)工厂模式

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实现类。

原文地址:https://www.cnblogs.com/maydow/p/4833357.html