zoukankan      html  css  js  c++  java
  • java设计模式--简单工厂

    简单工厂不是一个标准的设计模式,但是很常用需要掌握。

    在java应用开发中,要"面向接口编程".

    1.java中接口的概念:
    在java中接口是一种特殊的抽象类,跟一般的抽象类相比,接口里面所有的方法都是抽象方法,接口里面所有的属性都是常量。

    2.接口用来做什么?
    接口相当于一份契约,约定了实现类应该要实现的功能。

    3.接口的思想:
    "封装隔离",这里的封装是指"对被隔离体的行为的封装"

    4.选择接口还是抽象类?
    在开发中,何时选用接口?何时选用抽象类?
    1.优先选择接口
    2.如果既要定义子类的行为,又要为子类提供公共的功能时应选择抽象类

     

    下面举例说明用简单工厂模式和不用简单工厂模式的区别:


    不用简单工厂模式:

    public interface TestService
    {
        public void service(String s);
    }

     

    复制代码
    public class TestServiceImpl implements TestService
    {
        @Override
        public void service(String s)
        {
            System.out.println("the service :" + s);
        }
    }
    复制代码

     

    复制代码
    public class TestClient
    {
        public static void main(String[] args)
        {
            TestService testservice = new TestServiceImpl();
            testservice.service("嘿嘿,测试数据哦");
        }
    }
    复制代码

    在上面的程序中有一个问题:客户端TestClient不但知道接口TestService,
    还知道具体的实现类TestServiceImpl。然而接口的思想是"封装隔离",
    所以实现类TestServiceImpl应该被接口TestService封装并同客户端隔TestClient离开,
    换句话说,客户端类TestClient根本就不应该知道具体的实现类是TestServiceImpl

     


     

     

    下面使用简单工厂来解决上面的问题:

    关于简单工厂的定义:
    提供一个创建对象实例的功能,而无须关心其具体的实现,被创建实例的类型可以是接口、抽象类,也可以是具体的类。

    public interface TestService
    {
        public void service(String s);
    }

     

    复制代码
    public class TestServiceImpl implements TestService
    {
        @Override
        public void service(String s)
        {
            System.out.println("the service :" + s);
        }
    }
    复制代码
    复制代码
    /**
     * 功能:
     *         工厂类,用来创建对象
     * @author Administrator
     *
     */
    public class Factory
    {
        public static TestService createService()
        {
            TestService service = new TestServiceImpl();
            return service;
        }
    }
    复制代码
    复制代码
    public class TestClient
    {
        public static void main(String[] args)
        {
            TestService testservice = Factory.createService();
            testservice.service("嘿嘿,测试数据哦");
        }
    }
    复制代码

     

    复制代码
    上面的示例,客户端TestClient通过简单工厂创建了一个实现接口的对象,然后面向
    接口编程,从客户端TestClient来看,根本不知道具体的实现是什么,也不知道是
    如果实现的,它只是知道通过工厂获得了一个接口对象,然后通过这个接口获取想要的功能。
    
    
    
    比较示例1和示例2,可以看出:
        示例1:只是用到了接口的多态部分的功能,而最重要的"封装隔离性"并没有体现出来。
        示例2:简单工厂使我们真正的开始面向接口编程,
    
    
    
    
    可能会存在一些疑问?
        简答工厂模式只是把new TestServiceImpl()放到了工厂里面进行,这和放到客户端有什么区别呢?
    
    (PS:理解这个问题的重点就在于理解简单工厂所处的位置)
    
    我们知道接口是用来封装隔离具体的实现的,目的就是不要让客户端知道封装体内部的具体实现。简单工厂的
    位置是位于封装体内的,也就是简单工厂是跟接口和具体的实现类在一起的,算是封装体内部的一个类,所以
    简单工厂知道具体的实现类是没有关系的。
    
    
    简单工厂的优缺点:
    
    优点:
    1.帮助封装:
        简单工厂帮助我们实现了组件的封装,然后让组件外部能真正的面向接口编程。
    
    2.解耦
        通过简单工厂,实现了客户端和具体实现类的解耦。
        (客户端根本就不知道具体的实现由谁来完成,也不知道具体是如何实现的。)
    
    
    缺点:
    1.增加客户端的复杂度
        客户端必须理解各个参数所代表的的功能和含义,才能正确的获取想要的对象。
        
    
    
    简单工厂的本质:选择实现类。
    
    理解:    具体的功能实现是由类来完成的,简单工厂的目的在于为客户端选择相应的实现类,从而
    使得客户端和实现类之间解耦。这样一来,具体实现类发生了变化,就不用变动客户端了,这个变化会被简单
    工厂给屏蔽掉。
    
    
    
    关于什么时候该选择简单工厂的建议:
    1.如果想把对外创建对象的功能集中管理和控制,就可以选择简单工厂。
    2.想要完成封装隔离具体实现,让外部只能通过接口来操作封装体,可以选择简单工厂。让
    客户端通过工厂来获取相应的接口,而无须关心具体的实现。
  • 相关阅读:
    android adb指令
    android中的4种点击事件
    Android中常用的布局
    String练习
    Java中的String类
    从零开始,搭建一个简单的购物平台(三)
    从零开始,搭建一个简单的购物平台(二)
    从零开始,搭建一个简单的购物平台(一)
    Echarts案例:整一个炫酷一点的仪表盘
    Echarts案例:使用象形柱状图(PictorialBar)实现电池效果柱状图
  • 原文地址:https://www.cnblogs.com/baiduligang/p/4247423.html
Copyright © 2011-2022 走看看