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

在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.想要完成封装隔离具体实现,让外部只能通过接口来操作封装体,可以选择简单工厂。让
客户端通过工厂来获取相应的接口,而无须关心具体的实现。

java设计模式--简单工厂的更多相关文章

  1. java设计模式--简单工厂模式

     简单工厂设计模式 工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式.它定义一个用于创建对象的接口,由子类决定实例化哪一个类. 核心知识点如下: (1) 大 ...

  2. Java设计模式 -- 简单工厂模式(SimpleFactory)

    一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.模式中包含的角色及其职责 1.工厂(C ...

  3. JAVA设计模式——简单工厂

    工厂模式分为三种:简单工厂模式,工厂方法模式,抽象工厂模式.我看有的书上和有的文章里是分为两种,没有简单工厂. 工厂模式主要的作用是:一个对象在实例化的时候可以选择多个类,在实例化的时候根据一些业务规 ...

  4. Java设计模式-简单工厂模式(Static Factory Method)

    简单工厂模式(Static Factory Method) 简单工厂模式是类的创建模式,又叫静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种 ...

  5. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  6. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

  7. Java设计模式之工厂方法模式(转) 实现是抽象工厂?

    Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站   文本Tag: 设计模式 Java [IT168 技术文章]         ...

  8. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  9. 浅析JAVA设计模式之工厂模式(二)

    1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...

随机推荐

  1. UNIX网络编程——send与recv函数详解

    #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags); ssize_ ...

  2. AsyncTask(异步任务)讲解-android的学习之旅(四十六)

    AsyncTask简介 Android的UI线程主要处理用户的按键,触屏和View的绘制等,不能在里面处理耗时的操作,否则会出现ANR,因此耗时的操作要单独开一个线程处理,但是新线程不能直接处理UI线 ...

  3. 安卓一键分享到qq,微信,微博,官方SDK非第三方

    当我们项目中需要集成分享功能时,我们通常会采取一下几个办法: 1.调用系统自带分享 优点:简单快速,几行代码搞定,不需添加任何额外包: 缺点:系统会调出手机内部所有带分享功能的APP,且界面风格跟随系 ...

  4. SQL 2012 Always On 为 MSCRMSqlClrLogin SQL 登录名创建非对称密钥时报语法错误

    根据实施手册中的下图的SQL在为MSCRMSqlClrLogin 创建非对称秘钥时报语法错误,具体的错误在就path那,调了多次还是报错,索性就把SQL拆开执行. 先执行这条 SELECT * FRO ...

  5. 【Unity Shaders】Lighting Models —— 衣服着色器

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  6. 使用UE4/Unity创建VR项目

    一.主要的步骤是说一下使用UE4,在此之前先说一下使用unity创建的VR项目 1.unity创建oculus rift dk2项目 在unity中创建一个简单的场景,让摄像机能看见场景中的物体,不对 ...

  7. UNIX环境高级编程——主线程与子线程的退出关系

    我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下. 1.  主线程等待新线程先结束退出,主线程后退出.正常执行. 示例代码: #include & ...

  8. UNIX环境高级编程——进程间通信概念

    进程间通信 --- IPC1. 进程间通信的目的a. 数据传输: 一个进程需要将他的数据发送给另一个进程b. 资源共享: 多个进程之间共享同样的资源c. 通知事件: 一个进程需要向另一个或一组进程发送 ...

  9. OC利用ijkplayer框架按照步骤集成实现电视直播

    一. 下载ijkplayer ijkplayer下载地址:https://github.com/Bilibili/ijkplayer 下载完成后解压, 解压后文件夹内部目录如下图: ijkplayer ...

  10. log4xx/log4j异步日志配置示例

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration S ...