DesignPatterns工厂方法模式河南理工大学大纲工厂方法模式概述工厂方法模式的结构与实现工厂方法模式的应用实例配置文件与反射工厂方法的重载工厂方法的隐藏工厂方法模式的优缺点与适用环境工厂方法模式概述使用简单工厂模式设计的按钮工厂工厂方法模式概述使用工厂方法模式改进后的按钮工厂工厂方法模式概述分析工厂方法模式:•不再提供一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成•如果出现新的按钮类型,只需要为这种新类型的按钮定义一个具体的工厂类就可以创建该新按钮的实例工厂方法模式概述工厂方法模式的定义类创建型模式工厂方法模式:定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。FactoryMethodPattern:Defineaninterfaceforcreatinganobject,butletsubclassesdecidewhichclasstoinstantiate.FactoryMethodletsaclassdeferinstantiationtosubclasses.工厂方法模式概述工厂方法模式的定义简称为工厂模式(FactoryPattern)又可称作虚拟构造器模式(VirtualConstructorPattern)或多态工厂模式(PolymorphicFactoryPattern)工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类工厂方法模式的结构与实现工厂方法模式的结构createreturnnewConcreteProduct();ConcreteProductProductConcreteFactory+FactoryMethod()...:ProductFactory+FactoryMethod()...:Product工厂方法模式的结构与实现工厂方法模式的结构工厂方法模式包含以下4个角色:•Product(抽象产品)•ConcreteProduct(具体产品)•Factory(抽象工厂)•ConcreteFactory(具体工厂)工厂方法模式的结构与实现工厂方法模式的实现典型的抽象工厂类代码:interfaceFactory{ProductFactoryMethod();}工厂方法模式的结构与实现工厂方法模式的实现典型的具体工厂类代码:classConcreteFactory:Factory{publicProductFactoryMethod(){returnnewConcreteProduct();}}工厂方法模式的结构与实现工厂方法模式的实现典型的客户端代码片段:……Factoryfactory;factory=newConcreteFactory();//可通过配置文件实现Productproduct;product=factory.FactoryMethod();……工厂方法模式的应用实例实例说明某系统运行日志记录器(Logger)可以通过多种途径保存系统的运行日志,例如通过文件记录或数据库记录,用户可以通过修改配置文件灵活地更换日志记录方式。在设计各类日志记录器时,开发人员发现需要对日志记录器进行一些初始化工作,初始化参数的设置过程较为复杂,而且某些参数的设置有严格的先后次序,否则可能会发生记录失败。为了更好地封装记录器的初始化过程并保证多种记录器切换的灵活性,现使用工厂方法模式设计该系统。(注:在.NET平台下常用的日志记录工具有Log4net、NLog等,.NETFramework也提供了一些用于记录日志的类,例如Debug、Trace、TraceSource等。)工厂方法模式的应用实例实例类图日志记录器结构图createcreateFileLoggerFactory+CreateLogger()...:LoggerLoggerFactory+CreateLogger()...:LoggerFileLogger+WriteLog()...:voidLogger+WriteLog()...:voidDatabaseLoggerFactory+CreateLogger()...:LoggerDatabaseLogger+WriteLog()...:voidClient工厂方法模式模式实例与解析实例一:电视机工厂•将原有的工厂进行分割,为每种品牌的电视机提供一个子工厂,海尔工厂专门负责生产海尔电视机,海信工厂专门负责生产海信电视机,如果需要生产TCL电视机或创维电视机,只需要对应增加一个新的TCL工厂或创维工厂即可,原有的工厂无须做任何修改,使得整个系统具有更加的灵活性和可扩展性。工厂方法模式工厂方法模式的优缺点与适用环境模式优点工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部在系统中加入新产品时,完全符合开闭原则工厂方法模式的优缺点与适用环境模式缺点系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销增加了系统的抽象性和理解难度工厂方法模式的优缺点与适用环境模式适用环境客户端不知道它所需要的对象的类(客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建)抽象工厂类通过其子类来指定创建哪个对象END