今天花了很多时间把工厂模式又整理了一下,发现以前都没怎么弄懂。。
工厂模式分为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个抽象工厂,这一点应该能注意到,以上就是工厂模式我目前接触到的全部内容,正在学习中。。。还是没有睡意。。。。。。。。
分享到:
相关推荐
其中,工厂模式是最常用的设计模式之一。工厂模式通过创建一个工厂类来封装对象的创建过程,使得客户端在使用对象时无需了解具体的创建细节,增强了系统的可扩展性和稳定性。例如,在EJB调用中,`em.create()`就类似...
为了更好地利用这些服务,开发者们总结了许多有效的设计模式,接下来将简要介绍几种常用的J2EE设计模式。 ##### 2.1 J2EE设计模式简介 J2EE设计模式主要关注于如何在J2EE环境中构建可伸缩、可维护的应用程序。这些...
工厂模式是最常用的设计模式之一,主要用于封装对象的创建过程。工厂模式的主要优点是解耦了创建过程和使用过程,系统可扩展性增强,稳定性增强。 例如,在面向对象编程中,一般一个 Class 都会继承一个接口,设定 ...
本资料重点介绍了J2EE中的常用设计模式以及Structs框架的深入理解。 首先,让我们深入探讨设计模式。设计模式并非具体的代码实现,而是描述在特定情境下如何设计软件组件的一种通用解决方案。在J2EE中,常见的设计...
### Java常用设计模式详解 #### 一、设计模式概述 设计模式是一种在特定情况下解决软件设计问题的经验总结,它能够帮助开发者在面对相似的问题时快速找到解决方案。设计模式大致可以分为三大类:创建型模式、结构...
Java设计模式和J2EE设计模式是构建大型企业级应用的核心技术之一,它们提供了解决常见软件设计问题的标准模板。设计模式是经验丰富的开发者在实践中总结出的最佳实践,被广泛应用于J2EE多层系统架构中,包括架构设计...
Java语言和基于Java的企业版(J2EE)中,设计模式的应用尤为关键,它们帮助开发者构建出更加灵活、易于维护的系统架构。 在创建型模式中,涉及到对象创建机制,目的是使对象的创建过程更加灵活、可复用。其中,抽象...
本指南将深入探讨在J2EE环境中常用的设计模式,帮助开发者更好地理解和应用这些模式。 **1. 单例模式** 单例模式确保一个类只有一个实例,并提供一个全局访问点。在J2EE中,例如EJB(Enterprise JavaBeans)中的...
本教程以"J2EE Web层设计模式实例演练"为主题,旨在帮助开发者深入理解和掌握在Web层中常用的设计模式,以提高代码质量、可维护性和可扩展性。 首先,我们要理解Web层在J2EE架构中的位置。Web层主要负责处理来自...
工厂模式是一种常用的创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。 **目的**:封装对象的创建过程,并且能让对象的创建独立于使用对象的过程。...
### Java设计模式详解 #### 一、引言 ...本文介绍了几种常用的设计模式,包括J2EE设计模式和软件开发设计模式,并详细探讨了它们的应用场景。希望这些知识能够帮助你在开发过程中更加高效地解决问题。
#### 十一、J2EE常用设计模式之工厂模式 **工厂模式** 是一种常用的创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类中。 **示例**: 假设我们需要创建...
**第六章 设计模式的概念与常用的J2EE设计模式** 设计模式是解决特定问题的可重用解决方案。工厂模式和单例模式是J2EE中常见的设计模式。工厂模式用于创建对象,降低了对象实例化的耦合度;单例模式保证了类只有一...
尽管部分内容展示的信息有限,但从标题“J2EE核心模式004.pdf”以及描述来看,可以理解为这是一本专注于J2EE核心设计模式的书籍,对于学习和理解J2EE平台上的软件开发具有重要意义。 ### J2EE概述 J2EE是一种基于...
接下来,“设计模式-迷你手册”可能是一本简洁明了的参考指南,涵盖了基本的设计原则和一些最常用的设计模式。它可能包括创建型模式(如抽象工厂、工厂方法、建造者、单例)、结构型模式(如适配器、装饰器、代理、...
本书《J2EE核心模式003》很可能是深入探讨了在J2EE开发过程中常用的设计模式,以及如何有效地将这些模式应用于实际项目中。 ### J2EE核心设计模式概览 #### 1. MVC(Model-View-Controller) MVC是一种经典的架构...