设计模式(一) —— 工厂模式

184 阅读3分钟

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();
}