1、工厂模式的概念
工厂模式是我们最常用的实例化对象的一种模式,是用工厂方法代替new操作的一种模式。
工厂模式又可以分为工厂方法模式和抽象工厂模式两种,抽象工厂模式是工厂方法模式的扩展。
2、工厂模式的使用
2.1 工厂方法模式的使用步骤
第一步:创建一个接口,里面定义一个或者多个抽象方法
public interface Car {
void run();
void stop();
}
第二步: 创建多个实现上述接口的子类
public class Beaz implements Car {
public void run() {
System.out.println("Beaz开车了");
}
public void stop() {
System.out.println("Beaz停车了");
}
}
public class Ford implements Car {
public void run() {
System.out.println("Ford开车了");
}
public void stop() {
System.out.println("Ford停车了");
}
}
第三步:构建一个工厂类
public class Factory {
public static Car getInstance(String type) {
Car c = null;
try {
c = (Car) Class.forName("com.bc.factoryMethod." + type).newInstance();
} catch (Exception e) {
}
return c;
}
}
第四步:进行测试
//测试类
public class Test{
public static void main(String[] args){
Car c=Factory.getCatInstance(“Benz”);
if(c!=null){
c.run();
c.stop();
}else{
System.out.println("类型错误");
}
}
}
输出结果:
Beaz开车了
Beaz停车了
2.2 抽象工厂模式的使用步骤
第一步:构建一个抽象类,里面创建一个公共的抽象方法
public abstract class AbstractFactory {
public abstract String createProduct(String product);
}
第二步:构建一个用于生产啤酒的工厂类,该类继承了上述定义的抽象类,并重写里面的抽象方法用于生产各种啤酒
/**
* 啤酒工厂
*/
public class BeerFactory extends AbstractFactory {
@Override
public String createProduct(String product) {
String result;
switch (product) {
case "Hans":
result = "汉斯";
break;
case "Yanjing":
result = "燕京";
break;
default:
result = "其他啤酒";
break;
}
return result;
}
}
构建一个用于生产咖啡的工厂类,该类继承了上述定义的抽象类,并重写里面的抽象方法用于生产各种咖啡
/**
* 咖啡工厂
*/
public class CoffeeFactory extends AbstractFactory {
@Override
public String createProduct(String product) {
String result;
switch (product) {
case "Mocca":
result = "摩卡";
break;
case "Latte":
result = "拿铁";
break;
default:
result = "其他咖啡";
break;
}
return result;
}
}
第三步:测试抽象工厂模式
public class Test {
public static void main(String[] args) {
String result = (new CoffeeFactory()).createProduct("Latte");
System.out.println(result);
}
}
输出结果:
拿铁
3、工厂方法模式和抽象工厂模式的比较
1、工厂方法模式是一种极端情况的抽象工厂模式,而抽象工厂模式可以看成是工厂模式的推广
2、工厂方法模式是用来创建一个产品的等级结构,而抽象工厂模式是用了创建多个产品的等级结构
3、工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类
4、什么情况下适合工厂模式
1、有一组类似的对象需要创建
2、在编码时不能预见需要创建哪种类的实例
3、系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节