【设计模式】第二章:工厂模式详解及应用案例

系列文章

【设计模式】七大设计原则
【设计模式】第一章:单例模式
【设计模式】第二章:工厂模式
【设计模式】第三章:建造者模式
【设计模式】第四章:原型模式
【设计模式】第五章:适配器模式
【设计模式】第六章:装饰器模式
【设计模式】第七章:代理模式
【设计模式】第八章:桥接模式
【设计模式】第九章:外观模式 / 门面模式
【设计模式】第十章:组合模式
【设计模式】第十一章:享元模式
【设计模式】第十二章:观察者模式
【设计模式】第十三章:模板方法模式
【设计模式】第十四章:策略模式
【设计模式】第十五章:责任链模式
【设计模式】第十六章:迭代器模式
【设计模式】第十七章:状态模式
【设计模式】第十八章:备忘录模式
【设计模式】第十九章:访问者模式
【设计模式】第二十章:解释器模式
【设计模式】第二十一章:命令模式
【设计模式】第二十二章:中介者模式



一、定义

摘自百度百科:
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

工厂模式为我们提供了一种创建对象的最佳方式,最大的特点是我们在创建对象的时候不会对客户端暴露创建逻辑,通过一个共同的接口去指向新创建的对象。


二、实现方式

工厂模式是一种比较统概的说法,实现方式共分为以下几种:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

1. 简单工厂模式

简单工厂模式又叫做静态工厂模式,它是由一个工厂来决定创建出哪一种产品的实例。

(1)角色分类

具体工厂

负责实现创建实例的内部逻辑,创建方法由外部调用,创建不同的产品

抽象产品

它是所有产品的父类,它负责来描述所有实例的共有的公共接口

具体产品

它是具体被创建的产品,所有被创建的对象都是这个角色下具体某个具体类的实例

(2)应用案例

例如:你肚子饿了,于是你便来到了一家面馆(具体工厂),然后面馆中有各种各样的面(抽象产品),然后可以根据自己的口味来下单合适的面(具体产品)

抽象产品

/**
 * 抽象产品
 */
public interface Noodles {
	/**
	 * 做面
	 */
	void cook();
}

具体产品

/**
 * 拉面
 */
public class Ramen implements Noodles {
	@Override
	public void cook(){
		System.out.println("正在制作拉面...");
	}
}
/**
 * 汤面
 */
public class SoupNoodles implements Noodles {
	@Override
	public void cook(){
		System.out.println("正在制作汤面...");
	}
}
/**
 * 炒面
 */
public class StirFriedNoodles implements Noodles {
	@Override
	public void cook(){
		System.out.println("正在制作炒面...");
	}
}

具体工厂

/**
 * 具体工厂
 */
public class CookFactory {
	
	/**
	 * 做面
	 * @param type 面条类型
	 */
	public static Noodles cookNoodles(String type) {
		switch (type) {
			case "Ramen":
				return new Ramen();
			case "SoupNoodles":
				return new SoupNoodles();
			case "StirFriedNoodles":
				return new StirFriedNoodles();
			default :
				return null;
		}
	}
}

测试类

public class Test {
	public static void main(String[] args){
		CookFactory factory = new CookFactory();
		
		Ramen ramen = factory.cookNoodles("Ramen");
		ramen.cook();
		SoupNoodles soupNoodles = factory.cookNoodles("SoupNoodles");
		soupNoodles.cook();
		StirFriedNoodles stirFriedNoodles = factory.cookNoodles("StirFriedNoodles");
		stirFriedNoodles.cook();
	}
}

测试结果

(3)优缺点

优点:

  • 将对象的创建与使用隔离开,使用时不必关心对象是如何创建的,并实现了解耦
  • 将实例的初始化放到工厂中实现,代码更易维护,并且更贴近面向对象/接口开发原则

缺点:

  • 过于依赖工厂,所有的实例都在该工厂中创建,若该工厂出现异常,则涉及工厂的地方都会出现异常
  • 违反开闭原则,每次想要新增产品时都需要修改工厂的逻辑,不便于新增

(4)小结

简单工厂可以理解为:通过一个抽象产品,从而派生出其他的具体产品。再通过一个工厂来完成具体产品的创建。

2. 工厂方法模式

工厂方法模式又称为工厂模式,是我们最常用的一种工厂模式,我们通过定义一个工厂的父类,该父类中包含一个创建对象的共有方法,再由其子类去创建具体对象。

(1)角色分类

抽象工厂

负责描述工厂的公共接口

具体工厂

实现了抽象工厂中的抽象方法,负责对象的创建

抽象产品

负责描述产品的公共接口,描述了产品的主要特性或功能

具体产品

实现了抽象产品中的接口,用于被工厂创建

(2)应用案例

比如:你感到肚子饿了想要吃面,这时你来到小吃街(抽象工厂),里面有许多家餐馆,每种餐馆只做一种面(抽象产品),那么你想要去你最喜欢的面馆中(具体工厂)去下单喜欢吃的面条(具体产品)

抽象产品

public abstract class Noodles {
	public abstract void eat();
}

具体产品

public class Ramen extends Noodles {
	
	@Override
	public void eat() {
		System.out.println("我要吃拉面...");
	}
}
public class SoupNoodles extends Noodles {
	
	@Override
	public void eat() {
		System.out.println("我要吃汤面...");
	}
}
public class StirFriedNoodles extends Noodles {
	
	@Override
	public void eat() {
		System.out.println("我要吃炒面...")
	}
}

抽象工厂

public abstract class NoodlesFactory {

	public abstract Noodles getNoodles();
}

具体工厂

/**
 * 拉面
 */
public class RestaurantA extends NoodlesFactory {

	@Override
	public Noodles getNoodles(){
		return new Ramen();
	}
}
/**
 * 汤面
 */
public class RestaurantB extends NoodlesFactory {
	
	@Override
	public Noodles getNoodles() {
		return new SoupNoodles();
	}
}
/**
 * 炒面
 */
public class RestaurantC extends NoodlesFactory {
	
	@Override
	public Noodles getNoodles() {
		return new StirFriedNoodles();
	}
}

测试类

public class Test {
	public static void main(String[] args){
		FactoryA factoryA = new FactoryA();
		factoryA.getNoodles().eat();
		
		FactoryB factoryB = new FactoryB();
		factoryB.getNoodles().eat();
		
		FactoryC factoryC = new FactoryC();
		factoryC.getNoodles().eat();
	}
}

运行结果

(3)优缺点

优点

  • 符合开闭原则,且可扩展度高,新增加功能只需要增加具体产品和工厂子类即可
  • 符合单一职责原则,每个工厂子类只负责对应的产品

缺点

  • 增加了系统复杂度,因为一个工厂只创建一种具体产品,那么类的数量会增加
  • 系统会变得更加抽象,不便于理解

(4)小结

工厂方法模式可以理解为:通过一个父类工厂来派生出其他的具体工厂,再通过一个抽象产品派生出其他的具体产品,由对应的具体工厂来创建,且每个具体工厂只负责创建一种具体产品

3. 抽象工厂模式

抽象工厂模式其实就是升级版的工厂方法模式,它是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

(1)角色分类

抽象工厂

负责描述工厂的公共接口

具体工厂

负责创建实例,供外部调用

抽象产品族

负责描述抽象产品的公共接口

抽象产品

负责描述具体产品的公共接口

具体产品

具体产品,由工厂创建

(2)应用案例

例如:你肚子感到饿了,你想去吃点东西,于是你来到了小吃街(抽象工厂),这条街有各种各样的食物(抽象产品族),比如主食、小吃等(抽象产品),于是你来到了其中的一家餐馆(具体工厂),里面有汉堡、薯条、炸鸡等食物(具体产品)

抽象产品族

public abstract class Food {
	public abstract void description();
}

抽象产品

public abstract class StapleFood extends Food {
}
public abstract class Snacks extends Food {
}

具体产品

/**
 * 米饭
 */
public class Rice extends StapleFood {
	@Override
	public void description() {
		System.out.println("米饭")
	}
}
/**
 * 面条
 */
public class Noodles extends StapleFood {
	@Override
	public void description() {
		System.out.println("面条");
	}
}
/**
 * 汉堡
 */
public class Hamburger extends Snacks {
	@Override
	public void description() {
		System.out.println("汉堡");
	}
}
/**
 * 薯条
 */
public class Chips extends Snacks {
	@Override
	public void description() {
		System.out.println("薯条");
	}
}

抽象工厂

public abstract class FoodFactory {
	/**
	 * 下单主食
	 */
	public abstract Food getStapleFood();

	/**
	 * 下单小吃
	 */
	 public abstract Food getSnacks();
}

具体工厂

public class StapleFoodFactory extends FoodFactory {
	@Override
	public Food getStapleFood() {
		//下单米饭
		return new Rice();
	}

	@Override
	public Food getSnacks() {
		//下单汉堡
		return new Hamburger();
	}
}
public class SnacksFactory extends FoodFactory {
	@Override
	public Food getStapleFood() {
		//下单面条
		return new Noodles();
	}

	@Override
	public Food getSnacks() {
		//下单薯条
		return new Chips();
	}
}

测试类

public class Test {
	public static void main(String[] args) {
		StapleFoodFactory stapleFactory = new StapleFoodFactory();
		stapleFactory.getStapleFood().description();
		stapleFactory.getSnacks().description();

		System.out.println("----------分割线----------");

		SnacksFactory snacksFactory = new SnacksFactory();
		snacksFactory.getStapleFood().description();
		snacksFactory.getSnacks().description();
	}
}

在这里插入图片描述

(3)优缺点

优点:

  • 符合开闭原则
  • 降低耦合
  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象

缺点:

  • 扩展比较麻烦,当需要增加某个产品族的产品时,不仅要在抽象产品中增加代码,还要在具体产品中增加代码

(4)小结

抽象工厂我们可以理解为:首先由抽象工厂派生出多个具体工厂,抽象产品族派生出多个抽象产品,再由抽象产品派生出多个具体产品,由具体工厂来创建具体产品,且同一个具体工厂可以创建多个具体产品


三、应用场景

以下部分内容摘自菜鸟教程

意图: 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决: 主要解决接口选择的问题。
何时使用: 我们明确地计划不同条件下创建不同实例时。
如何解决: 让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码: 创建过程在其子类执行。
应用实例:
您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
Hibernate 换数据库只需换方言和驱动就可以。
优点:
一个调用者想创建一个对象,只要知道其名称就可以了。
扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
屏蔽产品的具体实现,调用者只关心产品的接口。
缺点: 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
使用场景:
日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

四、总结

工厂模式共有三种实现方式:简单工厂模式工厂方法模式抽象工厂模式,每种模式都有不同的应用场景和优缺点,大家可以根据自身的应用场景来选择不同的实现方式来实现。


推荐

关注博客和公众号获取最新文章

Bummon’s BlogBummon’s Home公众号

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 J2EE核心技术 1.4.1 Servlet 1.4.2 JSP(Java服务页面) 1.4.3 EJB(企业JavaBean) 1.4.4 JDBC(Java数据库连接) 1.4.5 JTA/JTS(Java事务) 1.4.6 JNDI(Java命名和目录服务) 1.4.7 JavaMail(Java邮件服务) 1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同) 1.4.12 JCA(Java连接器体系) 1.5 小结 第二章 MVC模式介绍 2.1 MVC模式概述 2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发容器 2.5 小结 第二篇 建立和使用J2EE的开发平台 第三章 建立Java开发平台 3.1 建立Java开发环境 3.1.1 下载JDK 3.1.2 安装JDK 3.1.3 设定Path、Classpath和JAVA_HOME 3.2 验证JDK是否安装成功 3.3 建立J2EE的开发环境 3.3.1 下载SDK 3.3.2 安装SDK 3.3.3 设定Path、Classpath和J2EE_HOME 3.4 小结 第四章 Tomcat使用指南 4.1 Tomcat简介 4.1.1 Tomcat的目录结构 4.1.2 Tomcat的配置参数 4.2 建立Tomcat的开发环境 4.2.1 下载Tomcat 4.2.2 设定TOMCAT_HOME 4.3 验证Tomcat是否安装成功 4.4 创建和发布Web应用 4.4.1 创建和发布JSP应用程序 4.4.2 创建和发布Servlet应用程序 4.5 小结 第五章 Eclipse使用指南 5.1 Eclipse简介 5.1.1 Eclipse的历史 5.1.2 Eclipse的运行机制 5.2 建立Eclipse的开发环境 5.2.1 下载Eclipse 5.2.2 配置Eclipse 5.3 整合Eclipse和Tomcat 5.3.1 下载Eclipse的Tomcat插件 5.3.2 为Eclipse配置Tomcat插件 5.4 使用Eclipse建立Web开发项目 5.5 Eclipse的常用快捷键 5.5.1 有关格式化的快捷键 5.5.2 有关调试的快捷键 5.5.3 有关重构的快捷键 5.6 小结 第六章 Log4j使用指南 6.1 Log4j介绍 6.1.1 Log4j历史 6.1.2 Log4j组成 6.2 建立Log4j的开发环境 6.2.1 下载Log4j 6.2.2 配置Log4j 6.3 Log4j的使用方法 6.3.1 配置Log4j 6.3.2 配置根Logger 6.3.3 指定日志输出位置 6.3.4 指定日志输出格式 6.3.5 指定日志输出优先级 6.3.6 在代码中使用Log4j 6.4 改进Log4j 6.5 小结 第七章 Ant使用指南 7.1 Ant介绍 7.1.1 Ant简介 7.1.2 为什么要使用Ant 7.2 建立Ant的开发环境 7.2.1 下载Ant 7.2.2 配置Ant 7.3 Ant的使用方法 7.3.1 Ant能完成的工作 7.3.2 配置文件build.xml 7.3.3 编译源代码 7.3.4 创建JAR文件 7.4 小结 第八章 JUnit使用指南 8.1 JUnit介绍 8.1.1 JUnit简介 8.1.2 为什么要使用JUnit 8.2 建立JUnit的开发环境 8.2.1 下载JUnit 8.2.2 配置JUnit 8.3 JUnit的使用方法 8.3.1 继承TestCase 8.3.2 编写测试方法 8.3.3 编写断言 8.4 JUnit的新特性 8.4.1 改变测试方法的命名方式 8.4.2 不再继承TestCase 8.4.3 改变初始化和销毁方式 8.4.4 改变异常处理的方式 8.5 小结 第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 9.3.1 添加CVS资源库 9.3.2 提交和更新代码 9.4 小结 第三篇 J2EE开发工具整合技术 第十章 使用Spring快速实现Web开发 10.1 Spring介绍 10.1.1 Spring简介 10.1.2 下载Spring 10.1.3 配置Spring 10.2 Spring核心思想 10.2.1 反向控制(IoC) 10.2.2 依赖注入(DI) 10.3 利用Spring在JSP页面输出“HelloWorld”的示例 10.3.1 建立myHelloWorld工程 10.3.2 编写JSP页面helloWorld.jsp 10.3.3 编写控制器HelloWorldController.java 10.3.4 建立Spring的配置文档dispatcherServlet-servlet.xml 10.3.5 配置web.xml 10.3.6 启动Tomcat运行程序 10.4 Spring 的视图(View) 10.4.1 视图简介 10.4.2 视图解析 10.5 Spring的控制器(Controller) 10.5.1 Controller接口 10.5.2 命令控制器(BaseCommandController) 10.5.3 表单控制器(SimpleFormController) 10.5.4 多动作控制器(MultiActionController) 10.6 Spring的视图映射机制 10.6.1 分发器(DispatcherServlet) 10.6.2 视图映射 10.7 Spring的模型(Model) 10.7.1 模型简介 10.7.2 模型封装 10.8 小结 第十一章 使用Struts快速实现Web开发 11.1 Struts介绍 11.1.1 Struts简介 11.1.2 Struts和Spring比较 11.1.3 下载Struts 11.1.4 配置Struts 11.2 Struts的核心 11.2.1 ActionServlet(分发器) 11.2.2 Action(控制器) 11.2.3 Action Mapping(映射) 11.2.4 ActionForm(表单控制器) 11.2.5 ActionErrors(错误处理) 11.2.6 DispatchAction(多动作控制器) 11.3 利用Struts实现用户登录的示例 11.6.1 编写实现登录的页面login.jsp 11.6.2 编写存储登录用户信息的类User.java 11.6.3 编写控制器LoginAction.java 11.6.4 配置Struts文档struts-config.xml 11.6.5 配置web.xml 11.6.6 启动Tomcat运行示例 11.4 整合Spring和Struts 11.4.1 Spring和Struts的整合方式 11.4.2 编写实现登录的页面regedit.jsp 11.4.3 编写存储登录用户信息的类User.java 11.4.4 编写控制器RegeditAction.java 11.4.5 编写业务逻辑接口Regedit.java 11.4.6 编写具体的业务逻辑类RegeditImpl.java 11.4.7 编写Struts的配置文件struts-config.xml 11.4.8 编写Spring的配置文件spring-config.xml 11.4.9 配置web.xml 11.4.10 启动Tomcat运行示例 11.5 小结 第十二章 使用Hibernate快速实现持久层处理 12.1 Hibernate介绍 12.1.1 Hibernate简介 12.1.2 下载Hibernate 12.1.3 配置Hibernate 12.2 Hibernate的核心 12.2.1 Configuration(配置Connection) 12.2.2 SessionFactory(Connection工厂) 12.2.3 Session(提供Connection) 12.3 使用Hibernate操作数据库的示例 12.3.1 创建数据库表 12.3.2 编写表对应的JavaBean 12.3.3 编写JavaBean对应的Xml 12.3.4 编写Hibernate的配置文件 12.3.5 编写并验证测试程序 12.4 Hibernate的配置文件 12.4.1 Hibernate的两种配置方式 12.4.2 配置数据库连接池 12.4.3 使用JNDI 12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO 12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java 12.6.5 编写登录控制器LoginAction.java 12.6.6 建立数据库表 12.6.7 生成映射文件User.hbm.xml 12.6.8 生成POJO 12.6.9 编写注册的业务逻辑接口Regedit.java 12.6.10 编写注册的业务逻辑类RegeditImpl.java 12.6.11 编写登录的业务逻辑接口Login.java 12.6.12 编写登录的业务逻辑类LoginImpl.java 12.6.13 编写用户接口UserDAO.java 12.6.14 编写用户实现类UserDAOImpl.java 12.6.15 编写Struts的配置文件struts-config.xml 12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 13.2.2 需求规格说明书 13.3 系统设计 13.3.1 设计视图层 13.3.2 设计持久层 13.3.3 设计业务逻辑层 13.3.4 设计控制层 13.4 架构设计和环境搭配 13.4.1 网上调查系统采用的架构 13.4.2 在Eclipse下建立项目mySurvey 13.4.3 编写本项目的Ant文件 13.4.4 配置本项目的web.xml文件 13.5 编写网上调查系统的JSP页面 13.5.1 用户注册画面regedit.jsp 13.5.2 用户登录画面login.jsp 13.5.3 设定调查题目的画面surveyName.jsp 13.5.4 设定调查项目的画面surveyOption.jsp 13.5.5 设定调查子项目的画面surveyChildOption.jsp 13.5.6 填写调查的画面survey.jsp 13.5.7 查看调查结果的画面surveyOK.jsp 13.6 根据数据库表生成XML和POJO 13.6.1 生成对应的XML 13.6.2 生成POJO 13.7 编写网上调查系统的DAO 13.7.1 用户DAO接口UserDAO.java 13.7.2 调查题目DAO接口SurveyDAO.java 13.7.3 调查项目DAO接口SurveyOptionDAO.java 13.7.4 调查子项目DAO接口SurveyChildDAO.java 13.7.5 调查结果DAO接口SurveyChildCountDAO.java 13.7.6 用户DAO实现类UserDAOImpl.java 13.7.7 调查题目DAO实现类SurveyDAOImpl.java 13.7.8 调查项目DAO实现类SurveyOptionDAOImpl.java 13.7.9 调查子项目DAO实现类SurveyChildDAOImpl.java 13.7.10 调查结果DAO实现类SurveyChildCountDAOImpl.java 13.8 编写网上调查系统的业务逻辑类 13.8.1 注册接口Regedit.java 13.8.2 登录接口Login.java 13.8.3 设定调查题目接口SetSurvey.java 13.8.4 设定调查项目接口SetSurveyOption.java 13.8.5 设定调查子项目接口SetSurveyChild.java 13.8.6 统计调查结果接口SetSurveyChildCount.java 13.8.7 注册实现类RegeditImpl.java 13.8.8 登录实现类LoginImpl.java 13.8.9 设定调查题目实现类SetSurveyImpl.java 13.8.10 设定调查项目实现类SetSurveyOptionImpl.java 13.8.11 设定调查子项目实现类SetSurveyChildImpl.java 13.8.12 统计调查结果实现类SetSurveyChildCountImpl.java 13.9 编写网上调查系统的控制器类 13.9.1 登录控制器类LoginAction.java 13.9.2 注册控制器类RegeditAction.java 13.9.3 设定调查题目控制器类SurveyAction.java 13.9.4 设定调查项目控制器类SetSurveyAction.java 13.10 编写配置文件dispatcherServlet-servlet.xml 13.11 运行验证程序 13.12 小结 第十四章 内容管理系统 14.1 系统概述 14.2 需求分析 14.2.1 系统用例图 14.2.2 需求规格说明书 14.3 系统设计 14.3.1 设计视图层 14.3.2 设计持久层 14.3.3 设计业务逻辑层 14.3.4 设计控制层 14.4 架构设计和环境搭配 14.4.1 内容管理系统采用的架构 14.4.2 在Eclipse下建立项目myEdition 14.4.3 编写本项目的Ant文件 14.4.4 配置本项目的web.xml文件 14.5 编写内容管理系统的JSP页面 14.5.1 用户注册画面regedit.jsp 14.5.2 用户登录画面login.jsp 14.5.3 设定内容类别画面type.jsp 14.5.4 发布内容画面edit.jsp 14.5.5 浏览内容画面index.jsp 14.6 根据数据库表生成XML和POJO 14.6.1 生成对应的XML 14.6.2 生成POJO 14.7 编写内容管理系统的DAO 14.7.1 用户DAO接口UserDAO.java 14.7.2 内容类别DAO接口ContentTypeDAO.java 14.7.3 内容DAO接口ContentDAO.java 14.7.4 用户DAO实现类UserDAOImpl.java 14.7.5 内容类别DAO实现类ContentTypeDAOImpl.java 14.7.6 内容DAO实现类ContentDAOImpl.java 14.8 编写内容管理系统的业务逻辑类 14.8.1 注册接口Regedit.java 14.8.2 登录接口Login.java 14.8.3 设定内容类别的接口SetContentType.java 14.8.4 发布接口Edit.java 14.8.5 注册实现类RegeditImpl.java 14.8.6 登录实现类LoginImpl.java 14.8.7 设定内容类别的实现类SetContentTypeImpl.java 14.8.8 发布实现类EditImpl.java 14.9 编写内容管理系统的控制器类 14.9.1 登录控制器类LoginAction.java 14.9.2 注册控制器类RegeditAction.java 14.9.3 设定内容类别的控制器类ContentTypeAction.java 14.9.4 发布控制器类EditAction.java 14.9.5 内容控制器类ContentAction.java 14.9.6 浏览内容的控制器类IndexAction.java 14.10 编写Struts的配置文件struts-config.xml 14.11 编写Spring和Hibernate的配置文件spring-config.xml 14.12 解决Struts的中文乱码问题 14.13 运行验证程序 14.14 小结 第十五章 在线考试系统 15.1 系统概述 15.2 需求分析 15.2.1 系统用例图 15.2.2 需求规格说明书 15.3 系统设计 15.3.1 设计视图层 15.3.2 设计持久层 15.3.3 设计业务逻辑层 15.3.4 设计控制层 15.4 架构设计和环境搭配 15.4.1 在线考试系统采用的架构 15.4.2 在Eclipse下建立项目myExam 15.4.3 编写本项目的Ant文件 15.4.4 配置本项目的web.xml文件 15.5 编写在线考试系统的JSP页面 15.5.1 用户注册画面regedit.jsp 15.5.2 用户登录画面login.jsp 15.5.3 设定试题种类的画面shitiType.jsp 15.5.4 设定试题基本信息的画面shiti.jsp 15.5.5 设定试题项目的画面shitiOption.jsp 15.5.6 组织试卷的画面examInfo.jsp 15.5.7 参加考试的画面exam.jsp 15.5.8 考试成绩的画面examChengji.jsp 15.6 根据数据库表生成XML和POJO 15.6.1 生成对应的XML 15.6.2 生成POJO 15.7 编写在线考试系统的DAO 15.7.1 用户DAO接口UserDAO.java 15.7.2 试题种类DAO接口ShitiTypeDAO.java 15.7.3 试题题目DAO接口ShitiDAO.java 15.7.4 试题项目DAO接口ShitiOptionDAO.java 15.7.5 试卷DAO接口ExamDAO.java 15.7.6 用户DAO实现类UserDAOImpl.java 15.7.7 试题种类DAO实现类ShitiTypeDAOImpl.java 15.7.8 试题题目DAO实现类ShitiDAOImpl.java 15.7.9 试题项目DAO实现类ShitiOptionDAOImpl.java 15.7.10 试卷DAO实现类ExamDAOImpl.java 15.8 编写在线考试系统的业务逻辑类 15.8.1 注册接口Regedit.java 15.8.2 登录接口Login.java 15.8.3 设定试题种类接口SetShitiType.java 15.8.4 设定试题题目接口SetShiti.java 15.8.5 设定试题项目接口SetShitiOption.java 15.8.6 设定试卷接口SetExam.java 15.8.7 注册实现类RegeditImpl.java 15.8.8 登录实现类LoginImpl.java 15.8.9 设定试题种类实现类SetShitiTypeImpl.java 15.8.10 设定试题题目实现类SetShitiImpl.java 15.8.11 设定试题项目实现类SetShitiOptionImpl.java 15.8.12 设定试卷实现类SetExamImpl.java 15.9 编写在线考试系统的控制器类 15.9.1 登录控制器类LoginAction.java 15.9.2 注册控制器类RegeditAction.java 15.9.3 设定试题种类控制器类ShitiTypeAction.java 15.9.4 设定试题题目控制器类ShitiAction.java 15.9.5 设定试题项目控制器类ShitiOptionAction.java 15.9.6 试卷控制器类ExamAction.java 15.10 编写配置文件dispatcherServlet-servlet.xml 15.11 解决Spring的中文乱码问题 15.12 运行验证程序 15.13 小结
第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 J2EE核心技术 1.4.1 Servlet 1.4.2 JSP(Java服务页面) 1.4.3 EJB(企业JavaBean) 1.4.4 JDBC(Java数据库连接) 1.4.5 JTA/JTS(Java事务) 1.4.6 JNDI(Java命名和目录服务) 1.4.7 JavaMail(Java邮件服务) 1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同) 1.4.12 JCA(Java连接器体系) 1.5 小结 第二章 MVC模式介绍 2.1 MVC模式概述 2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发容器 2.5 小结 第二篇 建立和使用J2EE的开发平台 第三章 建立Java开发平台 3.1 建立Java开发环境 3.1.1 下载JDK 3.1.2 安装JDK 3.1.3 设定Path、Classpath和JAVA_HOME 3.2 验证JDK是否安装成功 3.3 建立J2EE的开发环境 3.3.1 下载SDK 3.3.2 安装SDK 3.3.3 设定Path、Classpath和J2EE_HOME 3.4 小结 第四章 Tomcat使用指南 4.1 Tomcat简介 4.1.1 Tomcat的目录结构 4.1.2 Tomcat的配置参数 4.2 建立Tomcat的开发环境 4.2.1 下载Tomcat 4.2.2 设定TOMCAT_HOME 4.3 验证Tomcat是否安装成功 4.4 创建和发布Web应用 4.4.1 创建和发布JSP应用程序 4.4.2 创建和发布Servlet应用程序 4.5 小结 第五章 Eclipse使用指南 5.1 Eclipse简介 5.1.1 Eclipse的历史 5.1.2 Eclipse的运行机制 5.2 建立Eclipse的开发环境 5.2.1 下载Eclipse 5.2.2 配置Eclipse 5.3 整合Eclipse和Tomcat 5.3.1 下载Eclipse的Tomcat插件 5.3.2 为Eclipse配置Tomcat插件 5.4 使用Eclipse建立Web开发项目 5.5 Eclipse的常用快捷键 5.5.1 有关格式化的快捷键 5.5.2 有关调试的快捷键 5.5.3 有关重构的快捷键 5.6 小结 第六章 Log4j使用指南 6.1 Log4j介绍 6.1.1 Log4j历史 6.1.2 Log4j组成 6.2 建立Log4j的开发环境 6.2.1 下载Log4j 6.2.2 配置Log4j 6.3 Log4j的使用方法 6.3.1 配置Log4j 6.3.2 配置根Logger 6.3.3 指定日志输出位置 6.3.4 指定日志输出格式 6.3.5 指定日志输出优先级 6.3.6 在代码中使用Log4j 6.4 改进Log4j 6.5 小结 第七章 Ant使用指南 7.1 Ant介绍 7.1.1 Ant简介 7.1.2 为什么要使用Ant 7.2 建立Ant的开发环境 7.2.1 下载Ant 7.2.2 配置Ant 7.3 Ant的使用方法 7.3.1 Ant能完成的工作 7.3.2 配置文件build.xml 7.3.3 编译源代码 7.3.4 创建JAR文件 7.4 小结 第八章 JUnit使用指南 8.1 JUnit介绍 8.1.1 JUnit简介 8.1.2 为什么要使用JUnit 8.2 建立JUnit的开发环境 8.2.1 下载JUnit 8.2.2 配置JUnit 8.3 JUnit的使用方法 8.3.1 继承TestCase 8.3.2 编写测试方法 8.3.3 编写断言 8.4 JUnit的新特性 8.4.1 改变测试方法的命名方式 8.4.2 不再继承TestCase 8.4.3 改变初始化和销毁方式 8.4.4 改变异常处理的方式 8.5 小结 第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 9.3.1 添加CVS资源库 9.3.2 提交和更新代码 9.4 小结 第三篇 J2EE开发工具整合技术 第十章 使用Spring快速实现Web开发 10.1 Spring介绍 10.1.1 Spring简介 10.1.2 下载Spring 10.1.3 配置Spring 10.2 Spring核心思想 10.2.1 反向控制(IoC) 10.2.2 依赖注入(DI) 10.3 利用Spring在JSP页面输出“HelloWorld”的示例 10.3.1 建立myHelloWorld工程 10.3.2 编写JSP页面helloWorld.jsp 10.3.3 编写控制器HelloWorldController.java 10.3.4 建立Spring的配置文档dispatcherServlet-servlet.xml 10.3.5 配置web.xml 10.3.6 启动Tomcat运行程序 10.4 Spring 的视图(View) 10.4.1 视图简介 10.4.2 视图解析 10.5 Spring的控制器(Controller) 10.5.1 Controller接口 10.5.2 命令控制器(BaseCommandController) 10.5.3 表单控制器(SimpleFormController) 10.5.4 多动作控制器(MultiActionController) 10.6 Spring的视图映射机制 10.6.1 分发器(DispatcherServlet) 10.6.2 视图映射 10.7 Spring的模型(Model) 10.7.1 模型简介 10.7.2 模型封装 10.8 小结 第十一章 使用Struts快速实现Web开发 11.1 Struts介绍 11.1.1 Struts简介 11.1.2 Struts和Spring比较 11.1.3 下载Struts 11.1.4 配置Struts 11.2 Struts的核心 11.2.1 ActionServlet(分发器) 11.2.2 Action(控制器) 11.2.3 Action Mapping(映射) 11.2.4 ActionForm(表单控制器) 11.2.5 ActionErrors(错误处理) 11.2.6 DispatchAction(多动作控制器) 11.3 利用Struts实现用户登录的示例 11.6.1 编写实现登录的页面login.jsp 11.6.2 编写存储登录用户信息的类User.java 11.6.3 编写控制器LoginAction.java 11.6.4 配置Struts文档struts-config.xml 11.6.5 配置web.xml 11.6.6 启动Tomcat运行示例 11.4 整合Spring和Struts 11.4.1 Spring和Struts的整合方式 11.4.2 编写实现登录的页面regedit.jsp 11.4.3 编写存储登录用户信息的类User.java 11.4.4 编写控制器RegeditAction.java 11.4.5 编写业务逻辑接口Regedit.java 11.4.6 编写具体的业务逻辑类RegeditImpl.java 11.4.7 编写Struts的配置文件struts-config.xml 11.4.8 编写Spring的配置文件spring-config.xml 11.4.9 配置web.xml 11.4.10 启动Tomcat运行示例 11.5 小结 第十二章 使用Hibernate快速实现持久层处理 12.1 Hibernate介绍 12.1.1 Hibernate简介 12.1.2 下载Hibernate 12.1.3 配置Hibernate 12.2 Hibernate的核心 12.2.1 Configuration(配置Connection) 12.2.2 SessionFactory(Connection工厂) 12.2.3 Session(提供Connection) 12.3 使用Hibernate操作数据库的示例 12.3.1 创建数据库表 12.3.2 编写表对应的JavaBean 12.3.3 编写JavaBean对应的Xml 12.3.4 编写Hibernate的配置文件 12.3.5 编写并验证测试程序 12.4 Hibernate的配置文件 12.4.1 Hibernate的两种配置方式 12.4.2 配置数据库连接池 12.4.3 使用JNDI 12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO 12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java 12.6.5 编写登录控制器LoginAction.java 12.6.6 建立数据库表 12.6.7 生成映射文件User.hbm.xml 12.6.8 生成POJO 12.6.9 编写注册的业务逻辑接口Regedit.java 12.6.10 编写注册的业务逻辑类RegeditImpl.java 12.6.11 编写登录的业务逻辑接口Login.java 12.6.12 编写登录的业务逻辑类LoginImpl.java 12.6.13 编写用户接口UserDAO.java 12.6.14 编写用户实现类UserDAOImpl.java 12.6.15 编写Struts的配置文件struts-config.xml 12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 13.2.2 需求规格说明书 13.3 系统设计 13.3.1 设计视图层 13.3.2 设计持久层 13.3.3 设计业务逻辑层 13.3.4 设计控制层 13.4 架构设计和环境搭配 13.4.1 网上调查系统采用的架构 13.4.2 在Eclipse下建立项目mySurvey 13.4.3 编写本项目的Ant文件 13.4.4 配置本项目的web.xml文件 13.5 编写网上调查系统的JSP页面 13.5.1 用户注册画面regedit.jsp 13.5.2 用户登录画面login.jsp 13.5.3 设定调查题目的画面surveyName.jsp 13.5.4 设定调查项目的画面surveyOption.jsp 13.5.5 设定调查子项目的画面surveyChildOption.jsp 13.5.6 填写调查的画面survey.jsp 13.5.7 查看调查结果的画面surveyOK.jsp 13.6 根据数据库表生成XML和POJO 13.6.1 生成对应的XML 13.6.2 生成POJO 13.7 编写网上调查系统的DAO 13.7.1 用户DAO接口UserDAO.java 13.7.2 调查题目DAO接口SurveyDAO.java 13.7.3 调查项目DAO接口SurveyOptionDAO.java 13.7.4 调查子项目DAO接口SurveyChildDAO.java 13.7.5 调查结果DAO接口SurveyChildCountDAO.java 13.7.6 用户DAO实现类UserDAOImpl.java 13.7.7 调查题目DAO实现类SurveyDAOImpl.java 13.7.8 调查项目DAO实现类SurveyOptionDAOImpl.java 13.7.9 调查子项目DAO实现类SurveyChildDAOImpl.java 13.7.10 调查结果DAO实现类SurveyChildCountDAOImpl.java 13.8 编写网上调查系统的业务逻辑类 13.8.1 注册接口Regedit.java 13.8.2 登录接口Login.java 13.8.3 设定调查题目接口SetSurvey.java 13.8.4 设定调查项目接口SetSurveyOption.java 13.8.5 设定调查子项目接口SetSurveyChild.java 13.8.6 统计调查结果接口SetSurveyChildCount.java 13.8.7 注册实现类RegeditImpl.java 13.8.8 登录实现类LoginImpl.java 13.8.9 设定调查题目实现类SetSurveyImpl.java 13.8.10 设定调查项目实现类SetSurveyOptionImpl.java 13.8.11 设定调查子项目实现类SetSurveyChildImpl.java 13.8.12 统计调查结果实现类SetSurveyChildCountImpl.java 13.9 编写网上调查系统的控制器类 13.9.1 登录控制器类LoginAction.java 13.9.2 注册控制器类RegeditAction.java 13.9.3 设定调查题目控制器类SurveyAction.java 13.9.4 设定调查项目控制器类SetSurveyAction.java 13.10 编写配置文件dispatcherServlet-servlet.xml 13.11 运行验证程序 13.12 小结 第十四章 内容管理系统 14.1 系统概述 14.2 需求分析 14.2.1 系统用例图 14.2.2 需求规格说明书 14.3 系统设计 14.3.1 设计视图层 14.3.2 设计持久层 14.3.3 设计业务逻辑层 14.3.4 设计控制层 14.4 架构设计和环境搭配 14.4.1 内容管理系统采用的架构 14.4.2 在Eclipse下建立项目myEdition 14.4.3 编写本项目的Ant文件 14.4.4 配置本项目的web.xml文件 14.5 编写内容管理系统的JSP页面 14.5.1 用户注册画面regedit.jsp 14.5.2 用户登录画面login.jsp 14.5.3 设定内容类别画面type.jsp 14.5.4 发布内容画面edit.jsp 14.5.5 浏览内容画面index.jsp 14.6 根据数据库表生成XML和POJO 14.6.1 生成对应的XML 14.6.2 生成POJO 14.7 编写内容管理系统的DAO 14.7.1 用户DAO接口UserDAO.java 14.7.2 内容类别DAO接口ContentTypeDAO.java 14.7.3 内容DAO接口ContentDAO.java 14.7.4 用户DAO实现类UserDAOImpl.java 14.7.5 内容类别DAO实现类ContentTypeDAOImpl.java 14.7.6 内容DAO实现类ContentDAOImpl.java 14.8 编写内容管理系统的业务逻辑类 14.8.1 注册接口Regedit.java 14.8.2 登录接口Login.java 14.8.3 设定内容类别的接口SetContentType.java 14.8.4 发布接口Edit.java 14.8.5 注册实现类RegeditImpl.java 14.8.6 登录实现类LoginImpl.java 14.8.7 设定内容类别的实现类SetContentTypeImpl.java 14.8.8 发布实现类EditImpl.java 14.9 编写内容管理系统的控制器类 14.9.1 登录控制器类LoginAction.java 14.9.2 注册控制器类RegeditAction.java 14.9.3 设定内容类别的控制器类ContentTypeAction.java 14.9.4 发布控制器类EditAction.java 14.9.5 内容控制器类ContentAction.java 14.9.6 浏览内容的控制器类IndexAction.java 14.10 编写Struts的配置文件struts-config.xml 14.11 编写Spring和Hibernate的配置文件spring-config.xml 14.12 解决Struts的中文乱码问题 14.13 运行验证程序 14.14 小结 第十五章 在线考试系统 15.1 系统概述 15.2 需求分析 15.2.1 系统用例图 15.2.2 需求规格说明书 15.3 系统设计 15.3.1 设计视图层 15.3.2 设计持久层 15.3.3 设计业务逻辑层 15.3.4 设计控制层 15.4 架构设计和环境搭配 15.4.1 在线考试系统采用的架构 15.4.2 在Eclipse下建立项目myExam 15.4.3 编写本项目的Ant文件 15.4.4 配置本项目的web.xml文件 15.5 编写在线考试系统的JSP页面 15.5.1 用户注册画面regedit.jsp 15.5.2 用户登录画面login.jsp 15.5.3 设定试题种类的画面shitiType.jsp 15.5.4 设定试题基本信息的画面shiti.jsp 15.5.5 设定试题项目的画面shitiOption.jsp 15.5.6 组织试卷的画面examInfo.jsp 15.5.7 参加考试的画面exam.jsp 15.5.8 考试成绩的画面examChengji.jsp 15.6 根据数据库表生成XML和POJO 15.6.1 生成对应的XML 15.6.2 生成POJO 15.7 编写在线考试系统的DAO 15.7.1 用户DAO接口UserDAO.java 15.7.2 试题种类DAO接口ShitiTypeDAO.java 15.7.3 试题题目DAO接口ShitiDAO.java 15.7.4 试题项目DAO接口ShitiOptionDAO.java 15.7.5 试卷DAO接口ExamDAO.java 15.7.6 用户DAO实现类UserDAOImpl.java 15.7.7 试题种类DAO实现类ShitiTypeDAOImpl.java 15.7.8 试题题目DAO实现类ShitiDAOImpl.java 15.7.9 试题项目DAO实现类ShitiOptionDAOImpl.java 15.7.10 试卷DAO实现类ExamDAOImpl.java 15.8 编写在线考试系统的业务逻辑类 15.8.1 注册接口Regedit.java 15.8.2 登录接口Login.java 15.8.3 设定试题种类接口SetShitiType.java 15.8.4 设定试题题目接口SetShiti.java 15.8.5 设定试题项目接口SetShitiOption.java 15.8.6 设定试卷接口SetExam.java 15.8.7 注册实现类RegeditImpl.java 15.8.8 登录实现类LoginImpl.java 15.8.9 设定试题种类实现类SetShitiTypeImpl.java 15.8.10 设定试题题目实现类SetShitiImpl.java 15.8.11 设定试题项目实现类SetShitiOptionImpl.java 15.8.12 设定试卷实现类SetExamImpl.java 15.9 编写在线考试系统的控制器类 15.9.1 登录控制器类LoginAction.java 15.9.2 注册控制器类RegeditAction.java 15.9.3 设定试题种类控制器类ShitiTypeAction.java 15.9.4 设定试题题目控制器类ShitiAction.java 15.9.5 设定试题项目控制器类ShitiOptionAction.java 15.9.6 试卷控制器类ExamAction.java 15.10 编写配置文件dispatcherServlet-servlet.xml 15.11 解决Spring的中文乱码问题 15.12 运行验证程序 15.13 小结
1.1 Java语言发展简史2 1.2 认识Java语言3 1.2.1 Java语言特性3 1.2.2 JavaApplet4 1.2.3 丰富的类库4 1.2.4 Java的竞争对手5 1.2.5 Java应用领域的优势7 1.3 Java平台的体系结构7 1.3.1 JavaSE标准版8 1.3.2 JavaEE企业版10 1.3.3 JavaME微型版11 1.4 JavaSE环境安装和配置12 1.4.1 什么是JDK12 1.4.2 JDK安装目录和实用命令工具介绍12 1.4.3 设置环境变量13 1.4.4 验证配置的正确性14 1.5 MyEcilpse工具介绍JavaSE环境安装和配置15 1.6 本章练习16 第2章 2.1 什么是程序18 2.2 计算机中的程序18 2.3 Java程序19 2.3.1 Java程序中的类型19 2.3.2 Java程序开发三步曲21 2.3.3 开发Java第一个程序21 2.3.4 Java代码中的注释23 2.3.5 常见错误解析24 2.4 Java类库组织结构和文档27 2.5 Java虚拟机简介28 2.6 Java技术两种核心运行机制29 2.7 上机练习30 第3章 3.1 变量32 3.1.1 什么是变量32 3.1.2 为什么需要变量32 3.1.3 变量的声明和赋值33 3.1.4 变量应用实例33 3.2 数据的分类34 3.2.1 Java中的八种基本数据类型34 3.2.2 普及二进制36 3.2.3 进制间转换37 3.2.4 基本数据类型间转换38 3.2.5 数据类型应用实例38 3.2.6 引用数据类型39 3.3 关键字.标识符.常量39 3.3.1 变量命名规范39 3.3.2 经验之谈-常见错误的分析与处理40 3.3.3 Java标识符命名规则41 3.3.4 关键字42 3.3.5 常量42 3.4 运算符43 3.4.1 算术运算符43 3.4.2 赋值操作符45 3.4.3 关系操作符47 3.4.4 逻辑操作符48 3.4.5 位操作符49 3.4.6 移位运算符49 3.4.7 其他操作符50 3.5 表达式52 3.5.1 表达式简介52 3.5.2 表达式的类型和值52 3.5.3 表达式的运算顺序52 3.5.4 优先级和结合性问题52 3.6 选择结构54 3.6.1 顺序语句54 3.6.2 选择条件语句54 3.6.3 switch结构59 3.6.4 经验之谈-常见错误的分析与处理65 3.6.5 Switch和多重if结构比较66 3.7 循环语句66 3.7.1 While循环67 3.7.2 经验之谈-常见while错误70 3.7.3 do-while循环72 3.7.4 for循环74 3.7.5 经验之谈-for常见错误76 3.7.6 循环语句小结78 3.7.7 break语句79 3.7.8 continue语句82 3.8 JavaDebug技术84 3.9 本章练习85 第4章 4.1 一维数组90 4.1.1 为什么要使用数组90 4.1.2 什么是数组91 4.1.3 如何使用数组92 4.1.4 经验之谈-数组常见错误97 4.2 常用算法98 4.2.1 平均值,最大值,最小值98 4.2.3 数组排序102 4.2.3 数组复制103 4.3 多维数组105 4.3.1 二重循环105 4.3.2 控制流程进阶107 4.3.3 二维数组111 4.4 经典算法113 4.4.1 算法-冒泡排序113 4.4.2 插入排序115 4.5 增强for循环116 4.6 本章练习117 第5章 5.1 面向过程的设计思想120 5.2 面向对象的设计思想120 5.3 抽象121 5.3.1 对象的理解121 5.3.2 Java抽象思想的实现122 5.4 封装124 5.4.1 对象封装的概念理解124 5.4.2 类的理解125 5.4.3 Java类模板创建125 5.4.4 Java中对象的创建和使用127 5.5 属性130 5.5.1 属性的定义130 5.5.2 变量131 5.6 方法132 5.6.1 方法的定义132 5.6.2 构造方法135 5.6.4 方法重载138 5.6.5 自定义方法138 5.6.6 系统提供方法139 5.6.7 方法调用140 5.6.8 方法参数及其传递问题144 5.6.9 理解main方法语法及命令行参数147 5.6.1 0递归算法147 5.7 this关键字148 5.8 JavaBean149 5.9 包150 5.9.1 为什么需要包?150 5.9.2 如何创建包151 5.9.3 编译并生成包:151
工厂模式是一种软件设计模式,用于创建对象。在Python中,可以使用工厂模式来封装对象的创建过程,并且可以在运行时动态地切换不同的对象实现。 工厂模式包括抽象工厂角色、具体工厂角色和产品角色三个主要组成部分。 抽象工厂角色是一个抽象的类或接口,定义了一个或多个创建产品的方法。在Python中,通常使用ABCMeta元类和abstractmethod装饰器来定义抽象基类和抽象方法。 具体工厂角色是抽象工厂角色的具体实现,实现了抽象工厂角色的创建产品的方法。 产品角色是具体工厂角色创建的对象,它们共同实现了同一个接口或继承了同一个父类。 在示例中,我们可以看到具体工厂角色的代码示例。其中,AliFactory、HuabeiFactory和WechatFactory分别实现了create_payment方法,并返回了对应的支付对象。这些具体工厂角色都继承自抽象工厂角色PaymentFactory,而PaymentFactory中定义了抽象方法create_payment。 通过使用工厂模式,我们可以封装对象的创建过程,提高代码的灵活性和可维护性。当需要创建不同的对象时,我们只需要调用对应的具体工厂角色来创建对象,而不需要直接实例化具体的产品角色。 综上所述,工厂模式是一种通过抽象工厂角色和具体工厂角色来封装对象创建过程的设计模式,可以实现对象的动态切换和解耦。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [23种Python设计模式之工厂方法模式详解](https://blog.csdn.net/weixin_51098806/article/details/123917610)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bummon.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值