创新型模式包括:
工厂方法(Factory
Method 其中又含简单工厂Simple
Factory)
抽象工厂(Abstract
Factory)
构造器模式(Builder)
原型模式(Prototype)
单例模式(Singleton)
<!--[endif]-->
工厂模式
简单工厂模式:根据所提供的数据返回某个类的一个实例。通常它返回的类都具有共同的父类和共同的方法
原理:首先创建一个提取方法,能在多个可能的类中决定返回的是哪一个类的实例,并将其返回。然后就能调用该类实例方法,而不必了解实际使用的哪个子类。从而使得数据依赖性问题和类的可用方法得以分离。
定义了一个Mobile接口 其中只有一个方法call()
public interface Mobile {
public void call();
}
不同的手机品牌分别实现,比如现在有Nokia和Moto2个实例
public class Nokia implements Mobile{
public void call() {
System.out.println("Nokia produced");
}
}
public class Moto implements Mobile{
public void call() {
System.out.println("Moto produced");
}
}
而之前所说的提取方法,也就是工厂就是MobileFactory,它根据传入的参数来选择实现不同的实例,有一个produceMobile方法
public class MobileFactory {
public Mobile produceMobile(String s){
if(s.equals("Nokia")){
return new Nokia();
}else{
return new Moto();
}
}
}
简单工厂把主要的工作都放在了工厂中进行判断,返回哪一个实例完全由工厂确定
new MobileFactory().produceMobile("Nokia");
工厂方法:
不再由单个工厂类决定到底应该实例化哪个子类,超类将这一决定推迟到每个子类中去完成。
使用工厂方法的时机:(这个还是不能完全理解,可能需要在实践中慢慢体会)
●类无法预计出必须创建哪个类的对象
●类要使用其子类指定所要创建的对象
●对于将创建哪个类,希望将有关信息局部化
工厂模式的几种不同形式:(这个也同样不能完全理解,要一点点找感觉)
●基类是抽象类,并且这种模式必须返回一个完全可工作的类
●基类中包含默认方法,仅当默认方法不够用时,才需要派生子类
●传递给工厂的参数将通知要返回哪些类类型,此时所有类必须有相同的方法名,但实现的操作可不同
同样还是手机生产的例子
现在将工厂变成一个接口
public interface MobileFactory {
public Mobile produceMobile();
}
而不同的品牌各自有自己的工厂NokiaFactory,MotoFactory,并返回相对应的自己的实例Nokia,Moto
public class NokiaFactory implements MobileFactory{
public Mobile produceMobile(){
return new Nokia();
}
}
public class MotoFactory implements MobileFactory{
public Mobile produceMobile() {
return new Moto();
}
}
与简单工厂相比,也就是将原本在一个工厂中返回哪一个实例的决定,延迟到了各个品牌各自的工厂类中去实现
而其中NokiaFactory就专门生产Nokia产品,MotoFactory就专门生产Moto产品
MobileFactory mf=new NokiaFactory();
Mobile nokia=mf.produceMobile();
抽象工厂模式:
能返回多个相关对象类中的一个,而每个对象类又能根据要求返回多个不同的对象。即,抽象工厂是一个能从几组类中返回其中某一组的工厂对象。
目的:把所生成的具体类相分离,类的实际名称被隐藏在工厂中,客户级不必了解,从而可以自由修改或交换这些产品类系列。
问题:抽象工厂模式生成的所有类具有相同的基类,但不可避免的,某些子类会有与其他类不同的额外方法,你无法确定是否能调用某个类的方法。解决办法:
在积累中定义所有的方法,如果无法修改基类,也可以派生一个新的基类,使之包含全部的方法。
还是在手机生产的例子上面进行修改,现在不同的手机厂商又有各自品牌下不同的A,B两款手机,这时候就形成了一个组合,也就是Nokia品牌的A型号手机,Nokia品牌的B型号手机,Moto品牌的A型号手机和Moto品牌额B型号手机,这时候就用到了抽象工厂模式
同样定义了一个工厂接口MobileFactory,但是这次不再只声明一个produce方法,因为要返回不同的手机
public interface MobileFactory {
public abstract Nokia produceNokia();
public abstract Moto produceMoto();
}
FactoryA和FactoryB用来生产A型号手机和B型号手机
public class FactoryA implements MobileFactory{
public Nokia produceNokia() {
return new NokiaA();
}
public Moto produceMoto() {
return new MotoA();
}
}
public class FactoryB implements MobileFactory{
public Nokia produceNokia() {
return new NokiaB();
}
public Moto produceMoto() {
return new MotoB();
}
}
而在手机这边,Nokia和Moto由于有不同的品牌,也被声明成了接口
public interface Nokia{
public abstract void call();
}
最后是产品类,也就是NokiaA,NokiaB,MotoA,MotoB
public class NokiaA implements Nokia{
public void call() {
System.out.println("NokiaA produced");
}
}
此时,我们要生产一个NokiaA,就可以执行
new FactoryA().produceNokia();
由于刚看设计模式,参考了很多网上的资料,但是仍然有许多纠结着不明白的地方,比如要是让我说清楚各种工厂方法什么时候该用,就会有些不知道怎么下手,现在只能对着写好的东西去看,去理解
3个工厂模式上,个人理解是:
工厂方法是对简单工厂的一种扩展,简单工厂把所有的判断都放在了工厂中,而工厂方法就像是在简单工厂的工厂上又加了一层,从而不再由工厂本身去决定生产那一种实例,而是由实现这个工厂的子类去完成这一工作
抽象工厂和工厂方法上,看了不少网上的资料,有一句话是得到很普遍赞同的
工厂方法是针对一个对象,而抽象工厂模式则是对一个类而言(还是有些一知半解)
我现在可以最方便看出的是,工厂方法上,工厂和生产的实例是一一对应的关系,在创建工厂的同时,产生哪一个实例就已经被确定了,而抽象工厂模式,则是对一个组合的应用,类似于拼装的概念,在A类下有abc产品,B类下也有abc产品,这个时候就用到了抽象工厂,有专门生产a、b、c的工厂,而工厂再返回不同类别的产品,这个过程对客户类是不可见的,他看不到期间生产的实例Aa,Ba等等,而只需要去执行产品的方法就可以了
希望大家给予纠正,谢谢
另外,我Google浏览器。为什么在上传rar的时候,会传不上来。。。
- 大小: 10 KB
- 大小: 17.9 KB
- 大小: 23.9 KB
分享到:
相关推荐
【Java学习笔记——全面解析】 Java作为一种广泛应用的高级编程语言,是软件开发领域的核心力量。这份"学习笔记——资料"涵盖了Java学习的各个方面,旨在帮助初学者和有经验的开发者巩固基础,提升技能。以下是对这...
【Java学习笔记——良葛格】是一份由爱好者良葛格整理的Java学习资料,主要以PDF格式呈现,虽然可能不完整,但包含了丰富的Java编程基础知识和实践技巧,旨在为初学者提供一个学习和参考的平台。以下是笔记中可能...
12. **设计模式**:设计模式是解决常见软件设计问题的经验总结,如单例模式、工厂模式、观察者模式等,熟练掌握设计模式可以提高代码质量和可维护性。 13. **框架应用**:Spring、MyBatis、Hibernate等框架极大地...
下面将详细讨论在给定文件中提及的两种模式——单例模式和工厂模式。 ### 单例模式 单例模式确保一个类只有一个实例,并提供全局访问点。这种模式在资源管理、缓存、日志记录等方面非常有用。在Java中,单例模式有...
在本笔记中,我们将探讨设计模式的核心概念,并通过具体的例子——`PizzaIngredientFactory`来实践这些模式。 首先,设计模式分为三大类:创建型、结构型和行为型模式。创建型模式关注对象的创建,如单例模式...
"Java入门第三季学习笔记"可能涵盖了更多高级话题,如反射、注解、设计模式和Java库的使用。反射允许程序在运行时检查类、接口、字段和方法的信息,提供了更大的灵活性。注解是一种元数据,可以用来提供编译器或运行...
该压缩包文件提供了丰富的UML学习资源,包括两本CHM格式的电子书——"23种经典设计模式UML类图汇总"和"UML图例子",以及可能包含的学习笔记,帮助初学者和经验丰富的开发者深入理解和应用UML。 1. **23种经典设计...
这份压缩包包含了博主在学习过程中记录的详细笔记,以及一份精心整理的设计模式表格,旨在帮助备考者系统、高效地掌握相关知识。 首先,我们来探讨一下“软考”——这是一项国家级的专业技术资格认证考试,旨在评测...
8. **设计模式**:C++的课件可能还会涉及常见的设计模式,如工厂模式、单例模式、观察者模式等,这些模式在实际开发中非常有用。 9. **调试与性能优化**:学习如何利用调试工具找出并修复程序中的错误,以及如何...
#### 五、设计模式——工厂模式 工厂模式是一种常用的创建型设计模式,它提供了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 1. **简单工厂模式**:由一个工厂对象...
在阅读源码时,我们需要注意代码的组织结构、模块化设计以及异常处理,同时还要理解各种设计模式的运用,如单例模式、工厂模式等。此外,调试技巧也是源码分析的关键,学会使用断点、日志打印、性能分析工具等将极大...
例如,单例模式确保一个类只有一个实例,工厂模式提供了一种创建对象的最佳方式,而观察者模式允许对象之间建立一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。...
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在Spring框架中,工厂模式体现在Spring容器(BeanFactory或ApplicationContext)中,容器根据配置文件或编程方式来创建和管理bean。Spring容器不仅...
本课程笔记主要涵盖了软件架构的重要概念、设计模式、评估标准以及实际应用,旨在帮助学习者深入理解并掌握软件架构设计的核心知识。 一、软件体系结构基本概念 软件体系结构是软件系统的高级构造,它描述了系统的...
### 深入解析《ejb学习笔记5》——消息驱动Bean详解 #### 消息驱动Bean概述 消息驱动Bean(MDB,Message Driven Bean)是Enterprise JavaBeans(EJB)框架中的一个重要组成部分,主要用于接收并处理来自消息中间件...
MFC的设计遵循了设计模式中的许多原则,如单例模式(Singleton)、工厂模式(Factory)和观察者模式(Observer)。 **文档/视图架构** MFC中的核心设计是文档/视图(Document/View)架构,这是一种分离数据(文档)...
为了减少这种依赖,可以采用抽象工厂模式,创建一个静态工厂类 `DataAccess`,`Program` 通过工厂类获取 `IPersonDao` 实例,降低了对具体实现的依赖。 然而,当依赖关系变得复杂时,手动管理这些关系会变得困难。...
### Google开源风格指南学习笔记——C++代码规范详解 #### 避免多重包含与使用前置声明 在C++开发中,避免多重包含是至关重要的,因为它可以减少编译时间并降低代码之间的依赖关系。当一个头文件被多次包含时,...
本文将深入探讨Spring的核心特点——控制反转(IoC)和面向方面编程(AOP),以及它们在Spring框架中的实现原理。 **一、控制反转(IoC)** 控制反转(Inversion of Control,简称IoC)是Spring的核心概念之一,它...