先看一道面试题:
场景:
GG请自己的女朋友和众多美女吃饭,但是GG自己不会做饭的或者做的饭很不好,这说明GG不用自己去创建各种食物的对象;各个美女都有各自的爱好,到麦当劳后她们喜欢吃什么直接去点就行了,麦当劳就是生产各种食物的工厂,这时候GG不用自己动手,也可以请这么多美女吃饭,所要做的就是买单O(∩_∩)O哈哈~
实现:(在后面)
接下来先学习一些知识,对理解面试题有帮助。
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
工厂模式可以分为三类:
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。简单工厂模式是工厂模式家族中最简单实用的模式。
简单工厂模式属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。它是由一个工厂对象决定创建出哪一种产品类的实例。
UML模式类图如下:
简单工厂模式的
实质是由一个工厂类根据
传入的参数,
动态决定应该创建哪一个产品类(产品类继承自一个父类或接口)的实例。
该模式中包含的角色及其职责
工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法
可以被外界直接调用,创建所需的产品对象。
抽象产品(Product)角色
负责描述所有实例所共有的公共接口(可理解为父类)。
具体产品(Concrete Product)角色
是简单工厂模式的创建目标,所有创建的对象都是充当该角色的某个
具体类的实例。
场景实现:
接口类(抽象为食物的共同特征):Food
实现类(各类食物):Chicken、Chips
工厂类(麦当劳):FoodFactory
抽象食物的共同特征,也就是希望得到什么样的食物,有一个总体的轮廓。
抽象食物的共同特征,也就是希望得到什么样的食物,有一个总体的轮廓。
public interface Food {
//获得相应的食物
public void get();
}
根据美女的口味去实现想要的食物。
public class Chicken implements Food {
@Override
public void get() {
// TODO Auto-generated method stub
System.out.println("1.我想要吃童子鸡");
}
}
public class Chips implements Food {
@Override
public void get() {
// TODO Auto-generated method stub
System.out.println("2.我想要一份薯条");
}
}
创建一个食物工厂类(专门负责生产食物)
//食物工厂
public class FoodFactory {
public static Food getFood(String type) throws InstantiationException, IllegalAccessException
{
if(type.equals("chicken"))
{
return Chicken.class.newInstance();
}
else if (type.equals("chips")) {
return Chips.class.newInstance();
}
else {
//这是在判断实例化某一个对象的时候输出的,不是food.get()里面输出的
System.out.println("怎么这里都没有我想要吃的东西啦!!生气");
return null;
}
}
}
测试类
public class FactoryTest {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
// TODO Auto-generated method stub
//实例化各类食物
Food chicken=FoodFactory.getFood("chicken");
Food chips=FoodFactory.getFood("chips");
Food icecream=FoodFactory.getFood("icecream");
if(chicken !=null)
{
chicken.get();
}
if(chips !=null)
{
chips.get();
}
if(icecream !=null)
{
icecream.get();
}
}
}
显示的结果为:
简单工厂模式的优缺点分析:
优点:
工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
缺点:
由于工厂类集中了所有实例的创建逻辑,这就直接导致一旦这个工厂出了问题,所有的客户端都会受到牵连;而且由于简单工厂模式的产品室基于一个共同的抽象类或者接口,这样一来,但产品的种类增加的时候,即有不同的产品接口或者抽象类的时候,工厂类就需要判断何时创建何种种类的产品,这就和创建何种种类产品的产品相互混淆在了一起,违背了单一职责,导致系统丧失灵活性和可维护性。而且更重要的是,简单工厂模式违背了“开放封闭原则”,就是违背了“系统对扩展开放,对修改关闭”的原则,因为当我新增加一个产品的时候必须修改工厂类,相应的工厂类就需要重新编译一遍。
简单工厂模式的实际应用简介:
作为一个最基本和最简单的设计模式,简单工厂模式却有很非常广泛的应用,我们这里以Java中的JDBC操作数据库为例来说明。
JDBC是SUN公司提供的一套数据库编程接口API,它利用Java语言提供简单、一致的方式来访问各种关系型数据库。Java程序通过JDBC可以执行SQL语句,对获取的数据进行处理,并将变化了的数据存回数据库,因此,JDBC是Java应用程序与各种关系数据进行对话的一种机制。
用JDBC进行数据库访问时,要使用数据库厂商提供的驱动程序接口与数据库管理系统进行数据交互。
客户端要使用使用数据时,只需要和工厂进行交互即可,这就导致操作步骤得到极大的简化,操作步骤按照顺序依次为:注册并加载数据库驱动,一般使用Class.forName();创建与数据库的链接Connection对象;创建SQL语句对象preparedStatement(sql);提交SQL语句,根据实际情况使用executeQuery()或者executeUpdate();显示相应的结果;关闭数据库。
具体实现改进:
(1)具体的产品类可以传入类名或者class,工厂方法通过反射机制获取具体的类并实例化;
(2)类名也可以通过配置文件配置和读取,灵活的扩展;