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

  • 相关阅读:
    从浏览器中复制的下载链接在迅雷中打开后无法获取想要的文件
    Linux服务器中conda创建新环境并安装pytorch
    数字证书编码ASN.1
    Exp3免杀原理
    bug0001:启动RuoYi框架Vue报错
    shell脚本后台运行于服务器,忘记kill导致脚本不断产生新的脚本相关的PID,如何kill这个后台脚本?
    PyCharm OSError: [Errno 48] Address already in use
    android studio右侧Gradle不显示Tasks
    [Swift]扩展UIColor:实现十六进制颜色字符串与UIColor之间的相互转换
    DNS反向解析失败导致的网络连接超时问题
  • 原文地址:https://www.cnblogs.com/maydow/p/4833357.html
Copyright © 2020-2023  润新知