今天来介绍简单工厂模式,工厂模式包括简单工厂模式和抽象工厂模式,今天先讲简单工厂模式,然后引申到抽象工厂模式

在没有工厂模式前,我们创建类是直接new一个对象,比如下面所示,北汽有两个小型SUV,分别是绅宝x25和绅宝x55,现在4s店要分别要一辆,然后就可以用下面的来新建对象

 public class ShenbaoX25 {
public ShenbaoX25() {
System.out.println("This is 绅宝X25");
}
} public class ShenbaoX55 {
public ShenbaoX55() {
System.out.println("This is 绅宝x55");
}
} public class Customer{
public static void main(String[] args){
ShenbaoX25 sbx25 = new ShenbaoX25();
ShenbaoX55 sbx55 = new ShenbaoX55();
}
}

传统新建对象

这样对象和消费者的耦合度高了,因为这两个对象绑定到一块了。在现实生活中,我们的汽车都是工厂里生产的,所以,联系实际,我们要用工厂模式试试。这里就是简单工厂模式,要点在哪里?

根据前篇文章,我们从WWH(WHAT?WHY?HOW)来开启学习步骤

1,WHAT?

什么是简单工厂模式,百度给的解释如下

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

简单的说就是,一个工厂可以生产很多产品,最后我们可以根据子类来设定生成的对象的类型,这就是简单工厂模式。

我的天哪,这个类不就是万能的上帝类了啊,我要个猪,就给猪,要个恐龙,就给个恐龙?实际上这样的类很少,或者说这个类比较专一,比如说这个类是计算器类,计算器类里面的子类完全可以枚举出来的,像加减乘除开方乘方阶乘的,所以我们完全可以将这个类细化为万能的计算器上帝类。这是后话。

2,WHY?

为什么要用这个模式呢?

想想以前,我们创建对象就是通过一个一个new的类,如果这些类的对象比较类似,比如说像上面的北汽汽车,这些车都有一些共同的属性或者方法,所以,我们可以采用将要求给工厂,工厂帮我们造,对吧,这就是存在价值,将我们解脱于不停的创建类似的类中去。

3,HOW?

怎么使用这个模式呢?

定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。

/***********************************************************/
//抽象类
abstract class Shenbao{
public abstract void RunInSpeed() ;
}
//实例化绅宝x25系列
public class ShenbaoX25 extends Shenbao {
@Override
public void RunInSpeed() {
// TODO Auto-generated method stub
}
}
//实例化绅宝x55系列
public class ShenbaoX55 extends Shenbao {
@Override
public void RunInSpeed() {
// TODO Auto-generated method stub
}
}
/***********************************************************/
//工厂类
interface BeiqiFactory{
Shenbao createShenbao();
}
//实现绅宝x25的创建
public class FactorySBX25 implements BeiqiFactory{
public ShenbaoX25 createSBX25() {
return new ShenbaoX25();
}
}
/***********************************************************/
//新建方法
public class Custom{
public static void GetSBX25(){
FactorySBX25 sbx25 = new FactorySBX25();
ShenbaoX25 x25 = sbx25.createSBX25();
}
}
/***********************************************************/

简单工厂模式

如上所示:步骤:

  1. 定义一个创建对象的接口
  2. 子类实现这个接口,然后有子类来决定实例化哪一个类

4,存在的问题

正如上面所说,如果类是种类是可以枚举的,比如说计算器的操作,加减乘除等,这可以使用简单工厂模式,但是如果类很多分支呢,比如说上面的这个汽车的例子,绅宝系列有绅宝x25,x35,x55,x65等,每个系列有MT和AT,每个MT有舒适版,精英版,豪华版等等,如果按照简单工厂模式生成的,那每一个系列都得有很多类,这样造成类的冗余。

造成这个原因是什么呢,就是耦合度太高了,是对象和类死死的绑定在一起,根据我们的观察啊,绅宝系列的轮子是一样的,中控也差不多,我们设想一下,有没有这种可能,就是说我们可不可以有一个抽象的工厂,这个工厂可以拿不同的产品来组合在一起,形成不同的对象?

答案是肯定的,这就是下面我要介绍的抽象工厂模式

注解

灵感来自:

1,http://blog.csdn.net/hguisu/article/details/7505909

2,大话设计模式(这本书挺好的,我只看了一部分,对计算器这个记得很清楚,所以上面就用了计算器的例子了,抽象工厂好像用的是超市收银系统,这个我用的是灵感1中的造车案例,原因是最近看了车,然后根据车的配置来细化这个问题,有什么不正之处敬请指正。)

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

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

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...

  2. Java设计模式2:简单工厂模式

    简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...

  3. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

  4. JAVA设计模式之【简单工厂模式】

    1.创建抽象类User public abstract class User // 抽象类 { public void sameOperation() { System.out.println(&qu ...

  5. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  6. Java描述设计模式(02):简单工厂模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景简介 1.引入场景 订餐流程简单描述 1).食品抽象类,规定食品的基础属性操作 2).鱼类,鸡肉类食品类扩展 3).订餐流程类,根 ...

  7. JAVA设计模式(二)工厂模式

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  8. 我以订披萨为例,给女朋友详细讲了Java设计模式的3种工厂模式

    摘要:工厂模式是将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性. 本文分享自华为云社区<[Java设计模式]用 披萨订购案例 详 ...

  9. C#设计模式系列:简单工厂模式(Simple Factory)

    1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...

  10. Net设计模式实例之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...

随机推荐

  1. 实验:Oracle直接拷贝物理存储文件迁移

    实验目的:Oracle直接拷贝物理文件迁移,生产库有类似施工需求,故在实验环境简单验证一下. 实验环境: A主机:192.168.1.200 Solaris10 + Oracle 11.2.0.1 B ...

  2. PHP实现查询Memcache内存中的所有键与值

    使用Memcache时,我们可以用memcache提供的get方法,通过键查询到当前的数据,但是有时候需要查询内存中所有的键和值,这个时候可以使用下面的代码实现: <?php /** * Cre ...

  3. Coding4Fun Toolkit支持本地化解决办法

    在项目中需要使用Coding4Fun Toolkit中的TimePicker控件, 1. 但是在中文系统下显示的却是英文: 2. 最后发现,需要在源代码中添加中文资源,并重新编译出包含中文语言的dll ...

  4. 未能加载文件或程序集“Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5”或它的某一个依赖项。系统找不到指定的文件。

    在创建ASP.NET MVC项目过程中发生了这个异常 未能加载文件或程序集"Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0 ...

  5. 翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 2

    我们的目标: 需求 Screen 1: 联系人列表 - 查看所有联系人 1.1 这个 screen 将显示数据库中的所有联系人. 1.2 用户可以删除任何联系人.1.3 用户可以编辑任何联系人的详细信 ...

  6. C#语音朗读文本 — TTS的实现

    TTS, Text To Speech的缩写,是使用语音朗读文本的技术.目前,在国内应用较多的是排队叫号系统 Windows 平台的TTS,通常使用的是微软自带的 Speech API. Window ...

  7. 【转】MVC、MVP与MVT

    MVC是Model-View-Control的缩写,Model指的是数据层,View指的是UI层,Control指的是控制层,这三层之间彼此联系.View层的用户行为,触发Control层,Contr ...

  8. python 添加tab补全

    在平时查看Python方法用到tab补全还是很方便的. 1. mac 平台 配置如下: mac是类Unix平台,需要在添加一条配置内容到bash_profile 中(默认是没有这个文件,可以新建一个放 ...

  9. linux(六)__进程与任务控制

    一.程序.进程.线程 1.程序是一个普通文件,是一系列指令和数据的集合,是一个静态的实体,是程序员写好之后存储于外设之上的代码.它是"死"的,而进程和程序都是"活&quo ...

  10. LinqToXml (一) Create Xml file By Dom /Linq

    目前,在xml 应用编程领域比较流行的开发模型是W3C 提供的DOM(文档对象模型),在.net Framework 通过命名空间 System.Xml 对该技术提供了支持.随着Linq to XMl ...