`
Strive_sprint
  • 浏览: 22505 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

j2ee常用设计模式之工厂模式

 
阅读更多

 

      今天花了很多时间把工厂模式又整理了一下,发现以前都没怎么弄懂。。

 

      工厂模式分为3种:简单工厂模式,工厂方法模式和抽象工厂模式。

 

1.简单工厂模式:

      其实这个概念我还真没怎么看懂,难道是我的智商有问题?既然概念没看懂就不说了,说说我知道的吧。

      简单工厂模式由三部分组成:工厂,抽象产品,具体产品

      刚才看见别人写的一个女娲造人的例子,一看就懂了,女娲就是工厂,脑海里的人就是抽象产品,捏出来的人就是具体产品。

      下面看个例子加深认识吧:

 

抽象产品:人

public interface Person {
	public void run();//人跑步的方法
	public void eat();//人吃饭的方法
	public void sleep();//人睡觉的方法
}

 

具体产品:学生

public class Student implements Person{
	public void run() {
		System.out.println("学生跑步");
	}
	public void eat() {
		System.out.println("学生吃饭");
	}
	public void sleep() {
		System.out.println("学生睡觉");
	}
}

 具体产品:老师

public class Teacher implements Person{
	public void run() {
		System.out.println("老师跑步");
	}
	public void eat() {
		System.out.println("老师吃饭");
	}
	public void sleep() {
		System.out.println("老师睡觉");
	}
}

 

工厂:学校

public class School {
	public static Person getPerson(String type){
		Person person = null;
		if(type.equals("student")){//如果要学生就造个学生
			person = new Student();
		}
		if(type.equals("teacher")){//如果要老师就造个老师
			person = new Teacher();
		}
		return person;
	}
}

 

测试类:

public class Test {
	public static void main(String [] args){
		Person person = School.getPerson("student");
		person.run();
		person.eat();
		person.sleep();
		person = School.getPerson("teacher");
		person.run();
		person.eat();
		person.sleep();
	}
}

 

      很显然都知道结果是什么。刚开始创建了学生对象,后面创建了老师对象。看上去好像很不错,但其实也存在问题:如果我要加个具体校长类呢?那不是又要修改工厂方法吗?下面就引出了工厂方法模式。

 

2.工厂方法模式:

      工厂方法模式由四部分组成:抽象工厂,具体工厂,抽象产品,具体产品

      下面看看对上面的例子进行改进,在不修改工厂方法的基础上加个校长:

 

      抽象产品中人类,学生类,老师类我就不写了,再加个校长类:

 

抽象产品:校长

public class Principal implements Person{
	public void run() {
		System.out.println("校长跑步");
	}
	public void eat() {
		System.out.println("校长吃饭");
	}
	public void sleep() {
		System.out.println("校长睡觉");
	}
}

 

和简单工厂模式不同

 

抽象工厂:

public interface School {
	public Person getPerson();
}

具体工厂:生产学生

public class School_student implements School{
	public Person getPerson() {
		return new Student();
	}
}

 

具体工厂:生产老师

public class School_teacher implements School{
	public Person getPerson() {
		return new Teacher();
	}
}

 

具体方法:生产校长

public class School_principal implements School{
	public Person getPerson() {
		return new Principal();
	}
}

 

测试类:

public class Test {
	public static void main(String [] args){
		Person person;
		School school = new School_student();//创建生产学生的学校
		person = school.getPerson();//创建学生
		person.run();
		person.eat();
		person.sleep();
		school = new School_teacher();//创建生产老师的学校
		person = school.getPerson();//生产老师
		person.run();
		person.eat();
		person.sleep();
		school = new School_principal();//创建生产校长的学校
		person = school.getPerson();//生产校长
		person.run();
		person.eat();
		person.sleep();
	}
}

 

      由上面的例子我们发现,将工厂抽象,然后我们需要什么样的人,就实现生产什么人的什么工厂,然后由工厂生产具体的人,是不是一下子就很清晰了,如果还要加辅导员,只要创建一个辅导员类实现Person类,然后创建生产辅导员的学校实例化School,根本不用改其他的类。如果我们接触的不是一个产品,而是一簇多类甚至几簇产品呢,这又怎么办?这就引入了抽象工厂模式。

 

3.抽象工厂模式:

      下面介绍一簇多类的例子,通过例子可能会更容易弄明白

 

 抽象产品:学生

public interface Student {
	public void study();//学生学习方法
	public void rest();//学生休息方法
}

 

具体产品:A级本科生

public class UndergraduateA implements Student{
	public void study() {
		System.out.println("本科生AAAAA学习方法");
	}
	public void rest() {
		System.out.println("本科生AAAAA休息方法");
	}
}

 

具体产品:B级本科生

public class UndergraduateB implements Student{
	public void study() {
		System.out.println("本科生BBBBB学习方法");
	}
	public void rest() {
		System.out.println("本科生BBBBB休息方法");
	}
}

 

具体产品:A级研究生

public class GraduateA implements Student{
	public void study() {
		System.out.println("研究生AAAAA学习方法");
	}
	public void rest() {
		System.out.println("研究生AAAAA休息方法");
	}
}

 

具体产品:B级研究生

public class GraduateB implements Student{
	public void study() {
		System.out.println("研究生BBBBB学习方法");
	}
	public void rest() {
		System.out.println("研究生BBBBB学习方法");
	}
}

 

抽象工厂:学校

public interface School {
	public Student getUndergraduate();//生产本科生
	public Student getGraduate();//生产研究生
}

 

具体工厂:生产A级学生的学校

public class School_A implements School{//生产A级学生
	public Student getUndergraduate() {
		return new UndergraduateA();
	}
	public Student getGraduate() {
		return new GraduateA();
	}
}

 

具体工厂:生产B级学生的学校

public class School_B implements School{//生产B级学生
	public Student getUndergraduate() {
		return new UndergraduateB();
	}
	public Student getGraduate() {
		return new GraduateB();
	}
}

 

测试类:

public class Test {

	public static void main(String[] args) {
		School school = new School_A();//创建A级学校
		Student undergraduate = school.getUndergraduate();//创建本科生
		Student graduate = school.getGraduate();//创建研究生
		undergraduate.study();
		undergraduate.rest();
		graduate.study();
		graduate.rest();
		school = new School_B();//创建B级学校
		undergraduate = school.getUndergraduate();//创建本科生
		graduate = school.getGraduate();//创建研究生
		undergraduate.study();
		undergraduate.rest();
		graduate.study();
		graduate.rest();
	}
}

 

      这里是一簇多类,所以只要一个抽象产品多个抽象工厂,一簇产品那就学生,但是有几类,A级和B级,然后就有一个抽象的工厂来生产他们,当我们要A级学生的时候就用一个A级学校实现这个工厂,需要本科生就生产本科生要研究生就生产研究生,要B级的也是一样,如果以后还要一个C级的,那么只要用C级学生实现Student,用C级学校实现School,就可以了,完全不用改动原来的代码。是不是很爽啊!

 

      下面再来看看多簇的例子。这里就以两簇为例吧:

 

抽象产品:衣服

public interface Clothes {
	public void getColor();//衣服的颜色
	public void getSize();//衣服的大小
}

 

抽象产品:裤子

public interface Trousers {
	public void getColor();//裤子的颜色
	public void getlength();//裤子的长短
}

 

具体产品:白色衣服

public class Clothes_white implements Clothes{
	public void getColor() {
		System.out.println("白色的衣服");
	}
	public void getSize() {
		System.out.println("170大小");
	}
}

 

具体产品:黑色衣服

public class Clothes_black implements Clothes{
	public void getColor() {
		System.out.println("黑色的衣服");
	}
	public void getSize() {
		System.out.println("180大小");
	}
}

 

具体产品:白色裤子

public class Trousers_white implements Trousers{
	public void getColor() {
		System.out.println("白色的裤子");
	}
	public void getlength() {
		System.out.println("170长短");
	}
}

 

具体产品:黑色裤子

public class Trousers_black implements Trousers{
	public void getColor() {
		System.out.println("黑色的裤子");
	}
	public void getlength() {
		System.out.println("180长短");
	}
}

 

抽象工厂:服装厂

public interface Clothing {
	public Clothes createClothes();//生产衣服的方法
	public Trousers createTrousers();//生产裤子的方法
}

 

具体工厂:白色服装厂

public class Clothing_white implements Clothing{//生产白色的服装
	public Clothes createClothes() {//生产白色衣服
		return new Clothes_white();
	}
	public Trousers createTrousers() {//生产白色裤子
		return new Trousers_white();
	}
}

 

具体工厂:黑色服装厂

public class Clothing_black implements Clothing{//生产黑色的服装
	public Clothes createClothes() {//生产黑色衣服
		return new Clothes_black();
	}
	public Trousers createTrousers() {//生产黑色裤子
		return new Trousers_black();
	}
}

 

测试类:

public class Test {
	public static void main(String [] args){
		Clothing clothing = new Clothing_white();//创建白色服装厂
		Clothes clothes = clothing.createClothes();//生产白色衣服
		Trousers trousers = clothing.createTrousers();//生产白色裤子
		clothes.getColor();
		clothes.getSize();
		trousers.getColor();
		trousers.getlength();
		clothing = new Clothing_black();//创建黑色服装厂
		clothes = clothing.createClothes();//生产黑色衣服
		trousers = clothing.createTrousers();//生产黑色裤子
		clothes.getColor();
		clothes.getSize();
		trousers.getColor();
		trousers.getlength();
	}
}

 

      这里是两簇的例子,如果是N簇M类,那么就要N个抽象产品,M个抽象工厂,这一点应该能注意到,以上就是工厂模式我目前接触到的全部内容,正在学习中。。。还是没有睡意。。。。。。。。

分享到:
评论

相关推荐

    J2EE设计模式.ppt

    其中,工厂模式是最常用的设计模式之一。工厂模式通过创建一个工厂类来封装对象的创建过程,使得客户端在使用对象时无需了解具体的创建细节,增强了系统的可扩展性和稳定性。例如,在EJB调用中,`em.create()`就类似...

    23种JAVA设计模式和15种J2EE设计模式

    为了更好地利用这些服务,开发者们总结了许多有效的设计模式,接下来将简要介绍几种常用的J2EE设计模式。 ##### 2.1 J2EE设计模式简介 J2EE设计模式主要关注于如何在J2EE环境中构建可伸缩、可维护的应用程序。这些...

    J2EE设计模式的简洁总结

    工厂模式是最常用的设计模式之一,主要用于封装对象的创建过程。工厂模式的主要优点是解耦了创建过程和使用过程,系统可扩展性增强,稳定性增强。 例如,在面向对象编程中,一般一个 Class 都会继承一个接口,设定 ...

    J2EE设计模式与Structs详解

    本资料重点介绍了J2EE中的常用设计模式以及Structs框架的深入理解。 首先,让我们深入探讨设计模式。设计模式并非具体的代码实现,而是描述在特定情境下如何设计软件组件的一种通用解决方案。在J2EE中,常见的设计...

    Java常用设计模式 j2ee

    ### Java常用设计模式详解 #### 一、设计模式概述 设计模式是一种在特定情况下解决软件设计问题的经验总结,它能够帮助开发者在面对相似的问题时快速找到解决方案。设计模式大致可以分为三大类:创建型模式、结构...

    Java设计模式 J2EE设计模式

    Java设计模式和J2EE设计模式是构建大型企业级应用的核心技术之一,它们提供了解决常见软件设计问题的标准模板。设计模式是经验丰富的开发者在实践中总结出的最佳实践,被广泛应用于J2EE多层系统架构中,包括架构设计...

    常用经典JAVA,J2EE设计模式大全

    Java语言和基于Java的企业版(J2EE)中,设计模式的应用尤为关键,它们帮助开发者构建出更加灵活、易于维护的系统架构。 在创建型模式中,涉及到对象创建机制,目的是使对象的创建过程更加灵活、可复用。其中,抽象...

    实用J2EE设计模式编程指南

    本指南将深入探讨在J2EE环境中常用的设计模式,帮助开发者更好地理解和应用这些模式。 **1. 单例模式** 单例模式确保一个类只有一个实例,并提供一个全局访问点。在J2EE中,例如EJB(Enterprise JavaBeans)中的...

    J2EE Web层设计模式实例演练

    本教程以"J2EE Web层设计模式实例演练"为主题,旨在帮助开发者深入理解和掌握在Web层中常用的设计模式,以提高代码质量、可维护性和可扩展性。 首先,我们要理解Web层在J2EE架构中的位置。Web层主要负责处理来自...

    与Spring技术相关的J2EE设计模式

    工厂模式是一种常用的创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。 **目的**:封装对象的创建过程,并且能让对象的创建独立于使用对象的过程。...

    java模式,设计模式,多种设计模式

    ### Java设计模式详解 #### 一、引言 ...本文介绍了几种常用的设计模式,包括J2EE设计模式和软件开发设计模式,并详细探讨了它们的应用场景。希望这些知识能够帮助你在开发过程中更加高效地解决问题。

    JavaEE面试常见问题及答案

    #### 十一、J2EE常用设计模式之工厂模式 **工厂模式** 是一种常用的创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类中。 **示例**: 假设我们需要创建...

    多层J2EE系统的架构与模式设计

    **第六章 设计模式的概念与常用的J2EE设计模式** 设计模式是解决特定问题的可重用解决方案。工厂模式和单例模式是J2EE中常见的设计模式。工厂模式用于创建对象,降低了对象实例化的耦合度;单例模式保证了类只有一...

    J2EE核心模式004.pdf

    尽管部分内容展示的信息有限,但从标题“J2EE核心模式004.pdf”以及描述来看,可以理解为这是一本专注于J2EE核心设计模式的书籍,对于学习和理解J2EE平台上的软件开发具有重要意义。 ### J2EE概述 J2EE是一种基于...

    设计模式迷你手册&C版&J2ee;版

    接下来,“设计模式-迷你手册”可能是一本简洁明了的参考指南,涵盖了基本的设计原则和一些最常用的设计模式。它可能包括创建型模式(如抽象工厂、工厂方法、建造者、单例)、结构型模式(如适配器、装饰器、代理、...

    J2EE核心模式003.pdf

    本书《J2EE核心模式003》很可能是深入探讨了在J2EE开发过程中常用的设计模式,以及如何有效地将这些模式应用于实际项目中。 ### J2EE核心设计模式概览 #### 1. MVC(Model-View-Controller) MVC是一种经典的架构...

Global site tag (gtag.js) - Google Analytics