博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】学习笔记4:简单工厂模式(Simple Factory)
阅读量:4073 次
发布时间:2019-05-25

本文共 1755 字,大约阅读时间需要 5 分钟。

本文出自   

之前已经学过“针对接口编程,而不是针对实现编程”,但是,当使用“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),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

你可能感兴趣的文章
TableDnd(JQuery表格拖拽控件)应用进阶
查看>>
[转]开源中最好的Web开发的资源
查看>>
Docker上部署SpringBoot项目并推送镜像到Docker Hub上---以MacOS为例
查看>>
bibtex I was expecting a `,‘ or a `}‘ 问题解决
查看>>
sql server中各类范式的理解
查看>>
进程同步
查看>>
Python中列表元素删除
查看>>
二分查找与递归式二分查找
查看>>
在Navicat for MySQL中修改表的编码格式
查看>>
【RPC】一步一步实现基于netty+zookeeper的RPC框架(四)
查看>>
补充另一版ArrayList的初始化过程
查看>>
java接口不能实例化原因浅谈
查看>>
Https加密及攻防
查看>>
Java生成随机不重复推广码邀请码
查看>>
Java8 Lambda表达式介绍
查看>>
Java8 stream流介绍
查看>>
Java多线程之synchronized及死锁编写
查看>>
Java NIO源码剖析及使用实例(一):Buffer
查看>>
[swift实战入门]手把手教你编写2048(一)
查看>>
[swift实战入门]手把手教你编写2048(二)
查看>>