一、什么事简单工厂模式
简单工厂模式属于类的创建型模式,又叫静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
二、模式中包含的角色及其职责
1、工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑,工厂类可以被外界直接调用,创建所需的产品对象。
2、抽象(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所有的公共接口。
3、具体产品(Concrete Product)角色
简单工厂模式所创建的具体实例对象。
三、简单工厂模式的优缺点
在这个模式中,工厂类是整个模式的关键所在,它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟创建哪个具体累的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
不难发现,简单工厂模式的缺点也正体现在器工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做得并不号。另外,当系统中的具体产品类不断增多的时候,可能会出现要求工厂类也要相应的修改,扩展性并不是很好。
四、简单的代码实现
1、工厂类代码如下:
public class FruitFactory {
/**
* @Title: getApple
* @Description: 获取Apple实例
* @param: @return
* @return: Fruit
* @date 2019年12月13日
*/
public static Fruit getApple() {
return new Apple();
}
/**
* @Title: getApple
* @Description: 获取Banana实例
* @return: Fruit
* @date 2019年12月13日
*/
public static Fruit getBanana() {
return new Banana();
}
/**
* @Title: getFruit
* @Description: 获取所有产品对象
* @return: Fruit
* @throws IllegalAccessException
* @throws InstantiationException
* @date 2019年12月13日
*/
public static Fruit getFruit(String fruitType) throws InstantiationException, IllegalAccessException {
if(fruitType.equalsIgnoreCase("apple")) {
return Apple.class.newInstance();
}else if (fruitType.equalsIgnoreCase("banana")) {
return Banana.class.newInstance();
}else {
System.out.println("找不到相应的实例化类");
return null;
}
}
/**
*
* @Title: getFruitByClazzName
* @Description: 获取所有产品对象
* @param: type
* @param: @throws ClassNotFoundException
* @param: @throws InstantiationException
* @param: @throws IllegalAccessException
* @return: Fruit
* @throws
* @date 2019年12月13日
*/
public static Fruit getFruitByClazzName(String type) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> fruit = Class.forName(type);
return (Fruit) fruit.newInstance();
}
2、抽象接口
public interface Fruit {
public void get();
}
3、具体实现类
public class Apple implements Fruit {
/**
* @Title: get
* @Description: 采集苹果
* @return: void
* @date 2019年12月13日
*/
@Override
public void get() {
System.out.println("采集苹果");
}
}
public class Banana implements Fruit {
/**
* @Title: get
* @Description: 采集香蕉
* @return: void
* @date 2019年12月13日
*/
@Override
public void get() {
System.out.println("采集香蕉");
}
}
4、测试类
public class FruitTest {
/**
* @Title: main
* @Description: 测试方法
* @param: @param args
* @return: void
* @throws IllegalAccessException
* @throws InstantiationException
* @throws ClassNotFoundException
* @date 2019年12月13日
*/
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
// 最笨的方法实现
Apple apple = new Apple();
apple.get();
Banana banana = new Banana();
banana.get();
// 实例化一个apple1 实现了多态
Fruit apple1 = new Apple();
apple1.get();
Fruit banana1 = new Banana();
banana1.get();
// 通过工厂实现实例(可以调用静态方法)
Fruit apple2 = FruitFactory.getApple();
apple2.get();
Fruit banana2 = FruitFactory.getBanana();
banana2.get();
Fruit apple3 = FruitFactory.getFruit("Apple");
apple3.get();
Fruit banana3 = FruitFactory.getFruitByClazzName("com.david.sample.Banana");
banana3.get();
}
}