1. 介绍
常见的工厂模式有简单工厂、工厂方法和抽象工厂
举个简单的例子,以生产冰箱为例。有三个品牌———海尔、格力、美的生产冰箱
简单工厂: 这一个工厂会生产三个品牌的冰箱,想要生产什么冰箱,告诉工厂我想要一个XX品牌的冰箱。
工厂方法: 工厂只会生产冰箱,每个品牌都有自己的工厂去生产自己品牌的冰箱。
抽象工厂: 工厂生产冰箱、抽油烟机、洗衣机等一系列的产品,每个品牌都有工厂去生产自己这一系列的产品。
2. 代码示例
2.1 简单工厂
定义一个冰箱的接口
// 冰箱的公共接口
public interface Fridge {
void showInfo();
}
// 海尔冰箱
public class HaierBridge implements Bridge {
@Override
public void showInfo() {
System.out.println("海尔冰箱");
}
}
// 格力冰箱
public class GreeBridge implements Bridge {
@Override
public void showInfo() {
System.out.println("格力冰箱");
}
}
// 美的冰箱
public class MideaBridge implements Bridge {
@Override
public void showInfo() {
System.out.println("美的冰箱");
}
}
简单工厂去创建三种冰箱
public class SimpleFactory {
public Fridge createFridge(String type) throws IllegalAccessException {
if ("Haier".equalsIgnoreCase(type)) {
return new HaierFridge();
} else if ("Gree".equalsIgnoreCase(type)) {
return new GreeFridge();
} else if ("Midea".equalsIgnoreCase(type)) {
return new MideaFridge();
} else {
throw new IllegalAccessException("type非法类型输入!");
}
}
}
使用简单工厂
public static void main(String[] args) {
SimpleFactory simpleFactory = new SimpleFactory();
Fridge fridge;
try {
fridge = simpleFactory.createFridge("Haier");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
fridge.showInfo();
}
2.2 工厂方法
在冰箱的基础上,创建一个工厂的接口,三个品牌工厂继承接口实现生产冰箱的方法
// 冰箱接口
public interface Fridge {
void showInfo();
}
// 海尔冰箱
public class HaierFridge implements Fridge {
@Override
public void showInfo() {
System.out.println("海尔冰箱");
}
}
// 格力冰箱
public class GreeFridge implements Fridge {
@Override
public void showInfo() {
System.out.println("格力冰箱");
}
}
// 美的冰箱
public class MideaFridge implements Fridge {
@Override
public void showInfo() {
System.out.println("美的冰箱");
}
}
// 工厂接口
public interface Factory {
public Fridge createFridge();
}
// 海尔工厂
public class HaierFactory implements Factory {
@Override
public Fridge createFridge() {
return new HaierFridge();
}
}
// 格力工厂
public class GreeFactory implements Factory {
@Override
public Fridge createFridge() {
return new GreeFridge();
}
}
// 美的工厂
public class MideaFactory implements Factory {
@Override
public Fridge createFridge() {
return new MideaFridge();
}
}
使用工厂方法
public static void main(String[] args) {
// 需要什么品牌的冰箱就使用什么品牌的工厂创建
HaierFactory haierFactory = new HaierFactory();
HaierFridge haierFridge = haierFactory.createFridge();
haierFridge.showInfo();
GreeFactory greeFactory = new GreeFactory();
GreeFridge greeFridge = greeFactory.createFridge();
greeFridge.showInfo();
MideaFactory mideaFactory = new MideaFactory();
MideaFridge mideaFridge = mideaFactory.createFridge();
mideaFridge.showInfo();
}
2.3 抽象工厂
如果我们的工厂不仅仅只生产冰箱,还会生产抽油烟机、洗衣机等,那就意味着工厂会生产这一系列的产品。每个品牌都会生产这些,这个时候就需要用到抽象工厂
定义冰箱、抽油烟机、洗衣机三种产品以及各个品牌的三种产品
// 冰箱
public interface Fridge {
void showInfo();
}
// 海尔冰箱
public class HaierFridge implements Fridge {
@Override
public void showInfo() {
System.out.println("海尔冰箱");
}
}
// 格力冰箱
public class GreeFridge implements Fridge {
@Override
public void showInfo() {
System.out.println("格力冰箱");
}
}
// 美的冰箱
public class MideaFridge implements Fridge {
@Override
public void showInfo() {
System.out.println("美的冰箱");
}
}
// 抽油烟机
public interface Extractor {
void showInfo();
}
// 海尔抽油烟机
public class HaierExtractor implements Extractor {
@Override
public void showInfo() {
System.out.println("海尔抽油烟机");
}
}
// 格力抽油烟机
public class GreeExtractor implements Extractor {
@Override
public void showInfo() {
System.out.println("格力抽油烟机");
}
}
// 美的抽油烟机
public class MideaExtractor implements Extractor {
@Override
public void showInfo() {
System.out.println("美的抽油烟机");
}
}
// 洗衣机
public interface Washer {
void showInfo();
}
// 海尔洗衣机
public class HaierWasher implements Washer {
@Override
public void showInfo() {
System.out.println("海尔洗衣机");
}
}
// 格力洗衣机
public class GreeWasher implements Washer {
@Override
public void showInfo() {
System.out.println("格力洗衣机");
}
}
// 美的洗衣机
public class MideaWasher implements Washer {
@Override
public void showInfo() {
System.out.println("美的洗衣机");
}
}
// 工厂
public abstract class Factory {
public abstract Fridge createFridge();
public abstract Extractor createExtractor();
public abstract Washer createWasher();
}
// 海尔工厂
public class HaierFactory extends Factory {
@Override
public Fridge createFridge() {
return new HaierFridge();
}
@Override
public Extractor createExtractor() {
return new HaierExtractor();
}
@Override
public Washer createWasher() {
return new HaierWasher();
}
}
// 格力工厂
public class GreeFactory extends Factory {
@Override
public Fridge createFridge() {
return new GreeFridge();
}
@Override
public Extractor createExtractor() {
return new GreeExtractor();
}
@Override
public Washer createWasher() {
return new GreeWasher();
}
}
// 美的工厂
public class MideaFactory extends Factory {
@Override
public Fridge createFridge() {
return new MideaFridge();
}
@Override
public Extractor createExtractor() {
return new MideaExtractor();
}
@Override
public Washer createWasher() {
return new MideaWasher();
}
}
使用抽象工厂
public static void main(String[] args) {
Factory factory = new HaierFactory();
factory.createFridge().showInfo();
factory.createExtractor().showInfo();
factory.createWasher().showInfo();
factory = new GreeFactory();
factory.createFridge().showInfo();
factory.createExtractor().showInfo();
factory.createWasher().showInfo();
factory = new MideaFactory();
factory.createFridge().showInfo();
factory.createExtractor().showInfo();
factory.createWasher().showInfo();
}