[Design Pattern]工厂模式
来源:互联网 发布:智能算法优化 编辑:程序博客网 时间:2024/06/07 09:06
工厂模式
当有一些要实例化的具体类,究竟实例化哪个类,要在运行时由一些条件来决定。当代码使用大量具体类时,我们就要考虑使用工厂模式了。
简单披萨工厂生产披萨(简单工厂生产类)。加盟披萨店,对披萨进行质量控制,给披萨店使用的框架,同时允许子类做决定(工厂方法模式)。最后通过抽象工厂模式使得每家披萨店使用的原料一致。
工厂方法模式
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
public abstract class PizzaStore{ public Pizza OrderPizza(String type) { Pizza pizza = createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } protected abstract Pizza createPizza(String type)}
在工厂方法模式中由每个商店自行负责createPizza()方法的行为。在简单工厂中,工厂是另一个由Pizzafore使用的对象。
为了避免字符串传入参数化的类型的危险。我们可以在编译时期就将参数上的错误挑出来。你可以创建代表参数类型的对象和使用静态常量或者enum。
设计原则-依赖倒置原则:要依赖抽象,不要依赖具体类
PizzaStore这个抽象类现在依赖Pizza这个抽象类。
ChicagoStyleChessPizza这个具体类也是依赖Pizza这个抽象类。
在实际运行的时候,根据具体的继承ChicagoPizzaStore和传入的参数type决定生产那些具体的Pizza。
抽象工厂模式(为了控制披萨店只使用工厂生产出的原料)
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
public class NYPizzaStore extends PizzaStore{ protect Pizza createPizza(String item) { Pizza pizza = null; PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory(); if(item.equals("cheese")) { pizza = new CheesePizza(ingredientFactory); } return pizza; }}
要点
- 所有的工厂都是用来封装对象的创建
- 简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦。
- 工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。
- 抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。
- 工厂是很有威力的技巧,帮助我们针对抽象编程,而不是针对具体类编程。
阅读全文
0 0
- [Design Pattern]工厂模式
- 【Design Pattern】简单工厂模式
- c++ Design Pattern 之 工厂模式
- Design Pattern - Factory - 设计模式 - 工厂
- Design Pattern: 简单工厂模式 v.s. 工厂方法模式
- 设计模式之 - 工厂方法模式 (Factory Method design pattern)
- 抽象工厂设计模式(Abstract Factory Design Pattern)
- Abstract Factory Design Pattern 抽象工厂设计模式 - 总结
- 抽象工厂设计模式(Abstract Factory Design Pattern)
- [Design Pattern]Python设计模式——工厂方法
- Design pattern设计模式
- Design Pattern, 设计模式
- Design Pattern: Mediator 模式
- Design Pattern: Singleton 模式
- Design Pattern: Singleton 模式
- Design Pattern: Builder 模式
- Design Pattern: Prototype 模式
- Design Pattern: Strategy 模式
- 瑞士银行推出比特币期货,押注加密货币
- 新加坡金管局发布“数字代币产品指南”
- mongodb基础操作
- 前缀和优化
- mysql解压版的配置方法
- [Design Pattern]工厂模式
- opencv中的BackgroundSubtractorKNN源码解读
- 10 JSP beanutils EL
- Windows Server2012无法打开运行空间池-服务器管理器WinRM插件可能已损坏或丢失
- 在python3中,关于redis读取数据带有‘b’的问题
- 洛谷P2983 [USACO10FEB]购买巧克力Chocolate Buying
- request和requestScope
- mongoDB学习笔记之创建用户账户以及权限
- FFmpeg安装--命令--Java封装