《设计模式02》-工厂方法
chapter02GoF设计模式创建型模式

为什么学习创建型模式
1 2 3
提高代码的可维护性和可扩展性
通过合理地使用创建型模式,可以减少代码的耦 合度,使代码更加模块化,便于维护和扩展。
解决常见的设计问题
创建型模式针对常见的设计问题提供了解决方案, 如单例模式解决全局唯一实例的问题,工厂模式 解决对象创建的问题等。
提高设计能力
掌握创建型模式有助于提高软件设计能力,使设 计更加符合面向对象的设计原则,如开闭原则、 单一职责原则等。
ABCD
抽象工厂模式
提供一个接口,用于创建相关或依赖对象的家族, 而不需要明确指定具体类。
建造者模式
通过提供一系列的步骤来构建一个复杂的对象, 使得对象的创建更加灵活和可复用。
适用场景
需要创建大量相似对象时,可以通过创建型模式 来提高代码的复用性和可维护性。
当对象的创建逻辑复杂且容易出错时,使用创建 型模式可以降低错误率并提高代码的可读性。
通过使用创建型模式,代码结构更加清晰,易于阅读和维护。
3. 提高性能
某些创建型模式(如对象池模式)可以提高性能,特别是在需要频繁创建和销 毁对象的情况下。
总结
局限性
1. 过度使用创建型模式可能导致代码过于复杂,增加理解 和维护的难度。
2. 在某些情况下,使用创建型模式可能不是最优解决方案, 例如过度使用单例模式可能导致代码缺乏灵活性。
展望
应用前景
创建型模式在未来的软件开发中仍将发挥重要作用,特别是在处理复杂对象关系、提高软件可维护性 和可扩展性方面。随着软件工程理论的不断发展,创建型模式将不断创新和完善,为解决实际软件开 发问题提供更多有效的解决方案。
THANKS
感谢观看
在工厂方法模式中,工厂方法抽象了创建对象的过程,由子 类决定要实例化哪一个类。工厂方法模式让子类决定要实例 化哪一个类,这样就可以在不修改客户端代码的情况下,增 加新的产品。
设计模式 工厂方法

设计模式工厂方法工厂方法(Factory Method)是一种创建型设计模式,它通过定义一个独立的工厂接口来创建对象,具体的对象创建由具体的工厂类负责。
工厂方法模式有以下几个角色:1. 抽象产品(Product):定义了产品的接口,是具体产品的父类。
2. 具体产品(ConcreteProduct):实现了抽象产品接口。
3. 抽象工厂(Factory):定义了工厂的接口,提供了创建产品的方法。
4. 具体工厂(ConcreteFactory):实现了抽象工厂接口,负责实际创建具体产品对象。
工厂方法模式的优点包括:1. 解耦了具体产品的创建和使用,客户端只需要关注抽象产品和抽象工厂接口。
2. 符合开闭原则,易于扩展新的产品和工厂。
3. 可以通过配置文件等方式来动态创建具体工厂类。
工厂方法模式的适用场景包括:1. 客户端不知道具体产品的类名,只知道抽象产品的接口。
2. 一个系统需要支持多种具体产品的创建。
3. 客户端和具体产品的解耦是必要的,避免客户端直接依赖具体产品。
举个例子,假如我们要实现一个简单的形状(Shape)工厂,可以生产圆形和正方形。
首先定义抽象产品接口Shape,具有一个绘制方法draw。
然后定义具体产品类Circle和Square,实现抽象产品接口。
接下来定义抽象工厂接口ShapeFactory,提供一个创建Shape对象的方法createShape。
最后实现具体工厂类CircleFactory和SquareFactory,分别负责创建具体产品类Circle和Square对象。
使用工厂方法模式,客户端只需要通过创建具体工厂对象,调用createShape 方法来创建具体产品,而无需知道具体产品的类名。
抽象产品接口interface Shape {void draw();}具体产品类:圆形class Circle implements Shape {public void draw() {System.out.println("画一个圆形");}}具体产品类:正方形class Square implements Shape {public void draw() {System.out.println("画一个正方形");}}抽象工厂接口interface ShapeFactory {Shape createShape();}具体工厂类:圆形工厂class CircleFactory implements ShapeFactory { public Shape createShape() {return new Circle();}}具体工厂类:正方形工厂class SquareFactory implements ShapeFactory { public Shape createShape() {return new Square();}}客户端public class Client {public static void main(String[] args) {ShapeFactory factory = new CircleFactory();Shape shape = factory.createShape();shape.draw();}运行结果:画一个圆形。
Java设计模式-工厂方法模式

Java设计模式-⼯⼚⽅法模式⼯⼚⽅法模式(Factory Method Pattern),是简单⼯⼚模式的扩展,定义⼀个创建对象的接⼝,但是让⼦类来觉得该实例化那个类。
⼯⼚⽅法让⼀个类推迟实例化⾄它的⼦类中。
⼯⼚⽅法模式有四个⾓⾊:抽象⼯⼚(Creator)⾓⾊:这是⼯⼚⽅法模式的核⼼,具体⼯⼚⾓⾊必须实现这个接⼝才能创建对象。
具体⼯⼚(Concrete Creator)⾓⾊:实现了抽象⼯⼚⾓⾊的接⼝,实现了抽象⼯⼚,⽤具具体产品的创建。
抽象产品(Product)⾓⾊:定义了产品的共性,实现对产品最抽象的定义。
具体产品(Concrete Product)⾓⾊:实现抽象产品⾓⾊的接⼝。
⼯⼚⽅法所创建的对象就是该⾓⾊的实例。
⼯⼚⽅法模其类图如下:抽象⼯⼚的代码模式:public abstract class AbstractComputerFactory {/*** 创建计算机抽象⽅法** @param tClass* @param <T> 泛型类* @return*/public abstract <T extends AbstractComputer> T createComputer(Class<T> tClass);}抽象产品的代码模式:/*** 抽象计算机类*/public abstract class AbstractComputer {/*** 抽象⽅法** @param info*/public abstract void printInfo(String info);}具体⼯⼚的代码模式:@Componentpublic class ComputerFactory extends AbstractComputerFactory {/*** 创建计算机抽象⽅法** @param tClass* @param <T> 泛型类* @return*/public <T extends AbstractComputer> T createComputer(Class<T> tClass) {AbstractComputer computer = null;try {computer = (AbstractComputer) tClass.getDeclaredConstructor().newInstance();} catch (Exception e) {e.printStackTrace();}return (T) computer;}}具体产品的代码模式:此处⽣产两种不同的产品,Apple和ThinkPad/*** 苹果笔记本*/@Componentpublic class AppleComputer extends AbstractComputer {/*** 输出** @param info*/public void printInfo(String info) {System.out.println(info);}}/*** ThinkPad 笔记本*/@Componentpublic class ThinkPadComputer extends AbstractComputer {/*** 输出** @param info*/public void printInfo(String info) {System.out.println(info);}}测试:@SpringBootTestclass AbstractComputerFactoryTest {@Autowiredprivate AbstractComputerFactory computerFactory;@Testvoid showComputerInfo() {AbstractComputer thinkPadComputer = computerFactory.createComputer(ThinkPadComputer.class);AbstractComputer appleComputer = computerFactory.createComputer(AppleComputer.class);thinkPadComputer.printInfo("这是 ThinkPad 笔记本。
深入浅出讲解设计模式中的工厂模式幻灯片PPT

计算机工程技术学院
设计模式之--简单工厂模式
追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM 爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或 肯德基,只管向服务员说“来四个鸡翅”就行。麦当劳和肯德 基就是生产鸡翅的Factory。
计算机工程技术学院
设计模式之--简单工厂模式
话说乾隆皇帝酷爱古董文物,大贪官和申当然不会放过这个溜 须拍马的好机会,但是苦于他自己不懂文物,也没有时间亲自 去收集鉴别,所以干脆私下里成立了一个衙门叫做文物管理局, 负责给他收集天下的古董文物。他什么时候想要只需一句话, “来一件XXX”,一件文物就到他手里了。 看出点名堂了吧,我们的和中堂要是在现代可是设计模式高手 哦。这就是简单工厂模式了。 文物管理局就是工厂,青铜器、字画、瓷器都是具体产品,客 户端当然是和申了,他不需要亲自创建这些产品,需要的时候 给工厂招呼一声就是了,虽然他不懂也没有时间去研究这些产 品(当官就是好啊,呵呵)。下面看看代码吧:
计算机工程技术学院
设计模式之--简单工厂模式
client FuitGardener +factory:Fruit
Interface Fruit
+grow:void +harvest:void +plant:void
Grape
+grow:void +harvest:void +plant:void
Seedless:boolen
+Factory: IAntique
瓷器司
水墨司
青铜司
+Factory: IAntique
+Factory: IAntique
+Factory: IAntique
《工厂方法模式》PPT课件

17
简单工厂法实现雷锋工厂的UML类图
精选PPT
18
工厂方法实现雷锋工厂的UML类图
精选PPT
19
简单工厂VS工厂方法
简单工厂模式优点:
☞工厂类含有必要的判断逻辑,可以决定在什么 时候创建哪一个产品类的实例,客户端可以免除 直接创建产品对象的责任,而仅仅“消费”产品。 ☞简单工厂模式通过这种做法实现了对责任的 分割。
有特征
虚拟的,表示此 方法是虚方法, 可以被子类重写
方法重写,表示覆盖 父类中相应的成员方
法
精选PPT
8
工厂方法模式(Factory Method)
定义一个用于创建对象的接口, 让子类决定实例化哪一个类。 工厂方法使一个类的实例化延迟到其子类。
___《设计模式》GoF
精选PPT
9
定义:
工厂方法模式又称为工厂模式,也叫虚拟构造器 (Virtual Constructor)模式或者多态工厂 (Polymorphic Factory)模式,它属于对象创建 型模式。在工厂方法模式中,工厂父类负责定义 创建产品对象的公共接口,而工厂子类则负责生 产具体的产品对象,这样做的目的是将产品类的 实例化操作延迟到工厂子类中完成,即通过工厂 子类来确定究竟应该实例化哪一个具体产品类。
精选PPT
10
工厂方法模式(Factory Method)结构图
定义工厂方法所创建的对 象的借口
声明工厂方法,该方法返回一个Product 类型的对象
具体的产品,实现了 Product借口
精选PPT
重定义工厂方法以返回一个 ConcreteProduct 实例
11
接口:
看似是:声明了一个类,而且类的成员都具有“行为”
工厂方法模式

工厂方法模式工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种将对象的实例化过程委托给子类的方式。
工厂方法模式将对象的创建与使用分离,客户端通过调用工厂类的方法来创建对象,而不直接调用对象的构造方法。
这样做的好处是,客户端不需要知道具体的对象是如何创建的,只需要知道如何使用即可,从而实现了对对象创建过程的封装。
在工厂方法模式中,通常会定义一个抽象的工厂类,其中包含一个抽象的工厂方法,用于创建产品对象。
具体的产品类通过继承工厂类,并实现工厂方法来创建具体的产品对象。
以生产手机的工厂为例,工厂类可以定义一个抽象的手机工厂类,其中包含一个抽象的生产手机的方法。
具体的手机品牌如苹果、小米、华为等可以通过继承工厂类,并实现生产手机的方法来创建具体的手机对象。
工厂方法模式的优点有:1. 降低了代码的耦合性。
客户端只需要依赖抽象的工厂接口即可,不需要依赖具体的产品类。
2. 提供了可扩展性。
通过定义抽象的工厂类和具体的工厂子类,可以方便地新增产品对象,而不需要修改现有的代码。
3. 符合开闭原则。
对于新增产品对象,只需要新增具体的工厂子类即可,不需要修改其他代码。
工厂方法模式的缺点有:1. 增加了系统的复杂度。
引入了抽象的工厂类和具体的工厂子类,增加了系统的结构和复杂度。
2. 增加了代码的数量。
相比直接调用对象的构造方法,通过工厂方法模式创建对象的方式需要更多的代码。
工厂方法模式在实际的开发中应用广泛。
例如,在数据库访问层中,往往会定义一个抽象的数据库工厂接口,其中包含抽象的数据库连接方法,具体的数据库厂商如MySQL、Oracle等可以通过实现数据库工厂接口来创建具体的数据库连接对象。
这样做的好处是,可以方便地切换不同的数据库,而不需要修改现有的代码。
总之,工厂方法模式是一种非常实用的设计模式,它将对象的创建过程委托给子类,降低了代码的耦合性,提高了系统的可扩展性和可维护性。
设计模式:工厂方法模式

设计模式:工厂方法模式今天说一下工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。
工厂方法让类把实例化推迟到子类所谓的决定并不是批模式允许子类本身在运行时做决定,而是指在编写创建者类时,不需知道创建的产品是哪一下,选择了使用哪个子类,就决定了实际创建的产品是什么。
1#region工厂模式23// 产品4public abstract class Product5{6public string productName;7}89// 建造者10//工厂方法是创建一个框架,让子类决定要如何实现具体的产品11public abstract class Creator12{13public Product FactoryMethod(string f_ProductType)14{15Product _product;16_product=CreateProduct(f_ProductType);//可对产品做其它的操作......17return_product;18}19//让子类去实现要生产什么产品20public abstract Product CreateProduct(string f_Type);2122}23#region产品24public class OneProduct : Product25{26public OneProduct()27{28productName = "OneProduct";29}30}3132public class TwoProduct : Product33{34public TwoProduct()35{36productName = "TwoProduct";37}38}3940public class FirstProduct : Product41{42public FirstProduct()43{44productName = "My FirstProduct";45}46}4748public class SecondProduct : Product49{50public SecondProduct()51{52productName = "My SecondProduct";53}54}55#endregion56//第一个建造工厂57public class OneCreator : Creator58{59public override Product CreateProduct(string f_Type) 60{61switch(f_Type)62{63case"one":64return new OneProduct();65case"two":66return new TwoProduct();67}6869return null;70}71}72//第二个建造工厂73public class TwoCreator : Creator74{75public override Product CreateProduct(string f_Type) 76{77switch(f_Type)78{79case"one":80return new FirstProduct();81case"two":82return new SecondProduct();83}84return null;85}86}87888990#endregion1static void Main(string[] args)2{345#region工场模式6789//第一个工厂两种产品10Creator _creator = new OneCreator();11Product _product = _creator.FactoryMethod("one");12Console.WriteLine(_product.productName);13_product = _creator.FactoryMethod("two");14Console.WriteLine(_product.productName);1516//第二个工厂造另两种产品1718Creator _tCreator = new TwoCreator();19Product _tProduct = _tCreator.FactoryMethod("one");20Console.WriteLine(_tProduct.productName);21_tProduct = _tCreator.FactoryMethod("two");22Console.WriteLine(_tProduct.productName);23#endregion2425Console.ReadLine();26}让我们来看一下依赖关系我们会看到 Creator 和所有的产品(OneProduct、TwoProduct...)都依赖了Product.这是依赖倒置原则:要依赖抽象,不要依赖具体类也就是说不能让具体产品去依赖Creator,不管是产品还是Creator都应该依赖于抽象就用这个原则我们要尽量做到1变量不可以持有具体类的引用(如果使用new就会有具体类的引用。
设计模式之工厂模式(3种)详解及代码示例

设计模式之⼯⼚模式(3种)详解及代码⽰例 ⼯⼚模式划分来说总共有三类:简单⼯⼚模式、⼯⼚⽅法模式和抽象⼯⼚模式。
其中简单⼯⼚模式不输⼊23种设计模式之⼀,但他们⼜都属于创建型模式。
我们依次讲解这三种⼯⼚模式。
⼀、简单⼯⼚ 1、什么是简单⼯⼚模式? ⾸先来说简单⼯⼚,简单⼯⼚模式,⼜叫做静态⼯⼚模式(Static Factory Method),由⼀个⼯⼚对象决定创建出哪⼀种产品类的实例,简单⼯⼚模式的实质是由⼀个⼯⼚类根据传⼊的参数,动态决定应该创建哪⼀个产品类。
属于创建型模式,但不属于GOF23设计模式。
2、简单⼯⼚适⽤场景 ⼯⼚类负责创建的对象⽐较少;客户端(应⽤层)只需要知道传⼊⼯⼚类的参数,对于如何创建对象(逻辑)不关⼼。
3、简单⼯⼚优缺点优点:只需要传⼊⼀个正确的参数,就可以获取你所需要的对象,⽽⽆需知道其细节创建。
缺点:⼯⼚类的职责相对过重,增加新的产品,需要修改⼯⼚类的判断逻辑,违背了开闭原则。
4、简单⼯⼚实现 ⾸先来看类图: 代码实现:public class ShapeFactory {public Shape getShape(String shapeType){if(shapeType.equalsIgnoreCase("circle")){return new Circle();}else if(shapeType.equalsIgnoreCase("rectangle")){return new Rectangle();}else if(shapeType.equalsIgnoreCase("squere")){return new Squere();}return null;}public Shape getShape(Class clazz) throws Exception{return (Shape) clazz.newInstance();}}⼆、⼯⼚⽅法模式 1、什么是⼯⼚⽅法 ⼯⼚⽅法模式(Factory Method),⼜称多态性⼯⼚模式,属于设计模式三⼤分类中的创建型模式,作为抽象⼯⼚模式的孪⽣兄弟,⼯⼚⽅法模式定义了⼀个创建对象的接⼝,但由⼦类决定要实例化的类是哪⼀个,也就是说⼯⼚模式让实例化推迟到⼦类。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工厂方法
cout<<“Total Sale:”<<sum;
}
class Client { public: void CreateAndUse(Factory& fac) { int sum = 0; IAnimal * ani =fac. CreateDog(); sum+= ani->Sale(); delete ani; IAnimal * ani = fac. CreateCat(); sum+= ani->Sale(); delete ani;
Client +CreateAndUse()
Factory
Dog +Sale()
Cat +Sale()
Fish +Sale()
Rabit
NewFactory
增加新的子类BlackDog,WhiteDog
<<接口>> IAnimal +Sale()
Client +CreateAndUse()
Factory
};
稳定与变化的部分
稳定
Client的多个功能 需要实例化各种产品
产品的访问接口(Sale功能)
变化
子类种类增加
产品的创建方式(如不同参数,不同过程等)
对Client采用
分离各产品的实例化
class Client { public: void CreateAndUse() { int sum = 0; IAnimal * ani = CreateDog(); sum+= ani->Sale(); delete ani; IAnimal * ani = CreateCat(); sum+= ani->Sale(); delete ani;
return new 软件工程(); void 学生::Study( ) { Factory * fac1 = new 软件工程Factory( ); 课程 * c1 = fac1->Crete课程(); Factory * fac2 = new 专业英语Factory( ); 课程 * c2 = fac->Crete课程(); ....... } return new 英语(); return new 专业英语(); return new 基础英语();
}
void OtherFuncs() { }
甚至合并工厂方法
class Factory { IAnimal * CreateAnimal( char type) { if (type == „D‟) return new Dog; else if (type ==„C‟) return new Cat; else if (type ==„F‟) return new Fish; else return NULL; } };
BlaockDog
WhiteDog 结束2
类1 结束4
类2
学生
+Sduty()
Factory +Create 课程(int id)
课程
void 学生::Study( ) { Factory * fac = new Factory( ); 课程 * c1 = fac->Crete课程(1); 课程 * c2 = fac->Crete课程(2); ....... }
CreateAndUse()
使用者与具体产品硬编 码,耦合紧密。
Cat * cat = new Cat; sum+= cat->Sale(); delete cat;
Fish * fish = new Fish; sum+= fish->Sale(); delete fish; cout<<sum<<endl;
Dog +Sale()
Cat +Sale()
Fish +Sale()
BlaockDog
WhiteDog
NewFactory
增加各种子类,并且组合使用
办法:可以定义多个工厂。
结束1 <<接口>> IAnimal +Sale() 结束3
Dog +Sale()
Cat +Sale() +Sale()
Fish
英语
软件工程
课程 * Factory::Create课程(int id ) { if( id == 1) return new 英语(); else if (id == 2) return new 软件工程(); else return null; }
工厂方法模式例-单工厂
工 厂 方 法 模 式 例 多 工 厂
工厂方法模式的适用性
优点
扩展产品时,完全支持开闭原则; 新增子类产品 新增产品树 用同构的产品树替换原有产品树 具有对应的层次结构,Client只通过产品的抽象
接口交互,不必明确知道具体的产品
不足
子类数量可能较多(有时可用类模版减少子类数
量)
迷宫游戏例-工厂方法模式
Class MazeFactory{ Public: Maze * CreateMaze( ) ;
MazeFactory的子类 EnchantedMazeFactory
class EnchantedMazeFactory:public MazeFactroy { public: EnchantedMazeFactory();
分离实例化部分
void OtherFuncs() { }
IAnimal * CreateDog(); IAnimal * CreateCat(); IAnimal * CreateFish(); };
IAnimal * ani = CreateFish(); sum+= ani->Sale(); delete ani;
使用IAnimal 接口呢?
IAnimal * ani = new Cat; sum+= cat->Sale(); delete ani ;
IAnimal * ani = new Fish; sum+= ani >Sale(); delete ani ; cout<<sum<<endl;
} void OtherFuncs( ) { }
学生
+Sduty()
Factory
+Create 课程()
课程
英 语 Factory
+Create 课程()
软 件 工 程 Factory
+Create 课程()
英语
软件工程
基 础 英 语 Factory
+Create 课程()
基础英语 专 业 英 语 Factory
+Create 课程()
专业英语
Client
}
void OtherFuncs() { }
工厂方法的基本解决方案
适应变化
增加新的子类,如ProductC或Rabit
增加新的子类,如ProductA1,ProductA2,
BlackDog,WhiteDog 增加各种子类,并且组合使用
增加新的子类Rabit
<<接口>> IAnimal +Sale()
class Client { public: void CreateAndUse(Factory& fac) { int sum = 0; IAnimal * ani =fac. CreateAnimal(„D‟); sum+= ani->Sale(); delete ani; IAnimal * ani = fac. CreateAnimal(„C‟); sum+= ani->Sale(); delete ani; IAnimal * ani = fac. CreateAnimal(„F‟); sum+= ani->Sale(); delete ani; cout<<“Total Sale:”<<sum;
第二部分 创建型设计模式
工厂方法模式(Factory Method Pattern) 简单工厂模式(Simple Factory Pattern) 单件模式(Singleton Pattern) 构造器模式(Builder Pattern)
原型模式(Prototype Pattern)
} Maze * CreateMaze( ) { Maze * aMaze = MakeMaze(); Room * r1 = MakeRoom(1); Room * r1 =.MakeRoom(2); Door * door =MakeDoor(r1,r2); aMaze->AddRoom(r1); aMaze->AddRoom(r2); r1->SetSide(North,makeWall()); r1->SetSide(East,door); r1->SetSide(South,makeWall()); r1->SetSide(West,makeWall()); r2->SetSide(North,makeWall()); r2->SetSide(East, makeWall()); r2->SetSide(South,makeWall()); r2->SetSide(West,door); return aMaze;
//工厂方法 virtual Maze * MakeMaze() const { return new Maze; } //模版方法模式 virtual Room * MakeRoom() const { return new Room; } virtual Wall * MakeRoom(int n) { return new Room(n); } virtual Door * MakeDoor( Room* r1,Room * r2) const { return new Door(r1,r2); } };