设计模式之简单工厂
来源:互联网 发布:威锋网mac 编辑:程序博客网 时间:2024/04/29 08:13
之前已经学过“针对接口编程,而不是针对实现编程”,但是,当使用“new”时,却的确是在实例化一个具体类,所以用的是具体实现,而不是接口。
- Duck duck = new MallardDuck( );
上面就是常用的实例化的new 方法。
用"new"有什么不好呢?
在技术上,new 没错,都是“改变”的错。
针对接口编程,可以隔离掉以后系统可能发生的一大堆改变。因为如果是针对接口而写,那么通过多态,它可以与任何新类实现该接口。
但是,使用大量的具体类时,也是自找麻烦,因为一旦加入新的具体类,就必须改变代码。也就是说,你的代码并非“对修改关闭”。相用新的类必须重新打开它。
认识简单工厂模式
假设要开一个比萨店,要获取很多不同类型的比萨,那么我们可以写这样一个方法来获取比萨对象:
- Pizza orderPizza(String type){
- Pizza pizza;
- if(type.equals("chees")){
- pizza = new CheesePizza();
- }else if(type.equals("greek")){
- pizza = new GreekPizza();
- }else if(type.equals("pepperoni")){
- pizza = new PepperoniPizza();
- }
- pizza.prepare();
- pizza.bake();
- pizza.cut();
- pizza.box();
- return pizza;
- }
所以我们把创建对象移到orderPizza()之外,由这个对象专职创建比萨。
SimplePizzaFactory只做一件事情:帮它的客户创建比萨。
- public class SimplePizzaFactory {
- public Pizza createPizza(String type) {
- Pizza pizza = null;
- if (type.equals("cheese")) {
- pizza = new CheesePizza();
- } else if (type.equals("pepperoni")) {
- pizza = new PepperoniPizza();
- } else if (type.equals("clam")) {
- pizza = new ClamPizza();
- } else if (type.equals("veggie")) {
- pizza = new VeggiePizza();
- }
- return pizza;
- }
- }
上面对象就是工厂(factory),工厂处理创建对象的细节。
PizzaStore类,使用SimplePizzaFactory对象来创建比萨
- public class PizzaStore {
- SimplePizzaFactory factory;
- public PizzaStore(SimplePizzaFactory factory) {
- this.factory = factory;
- }
- public Pizza orderPizza(String type) {
- Pizza pizza;
- pizza = factory.createPizza(type); //注意,把new变成了工厂的创建方法!不再使用具体实例化!
- pizza.prepare();
- pizza.bake();
- pizza.cut();
- pizza.box();
- return pizza;
- }
- }
定义简单工厂模式
简单工厂其实不是一个设计模式,反而是一种编程习惯,但是却经常使用。
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
- 设计模式 之简单工厂+ 工厂模式
- 设计模式 之 简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂.
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 隐藏vlc播放器转换界面办法
- C++内存分配
- code fragment-Windows截图
- C++ 简单类中实现各种操作符的重载
- 设计模式总论
- 设计模式之简单工厂
- C++虚函数表解析
- iOS消息推送机制的实现
- c++ primer 习题8.3
- c和c++函数参数为void / void *
- 飘逸的python - 赛程表算法
- iOS消息推送机制中pem文件的生成
- xml2bean 把xml文件直接封装成bean
- 博客改名