1. 程式人生 > >設計模式之抽象工廠模式(Java實現)

設計模式之抽象工廠模式(Java實現)

抽象工廠是一個超級工廠,用來建立其他工廠,又稱為工廠的工廠,也就是對各種不同的工廠再次進行抽象。在抽象工廠模式中,介面負責建立相關物件的工廠, 每個生成的工廠可以按照工廠模式提供物件。

首先建立兩個介面然後實現具體類

//再建立一個介面Plant
interface Plant {
    public void print();
}

//建立一個Cat的類實現Animal介面
class Cat implements Animal {
    public void print() {
        System.out.println("貓");
    }
}

//建立一個Dog的類實現Animal介面
class Dog implements Animal {
    public void print() {
        System.out.println("狗");
    }
}

//建立一個Rabbit的類實現Animal介面
class Rabbit implements Animal {
    public void print() {
        System.out.println("兔子");
    }
}

//建立一個Flower的類實現Plant介面
class Flower implements Plant {
    public void print() {
        System.out.println("花朵");
    }
}

//建立一個Tree的類實現Plant介面
class Tree implements Plant {
    public void print() {
        System.out.println("樹木");
    }

接下來重點來了,建立一個抽象的工廠類

//建立一個抽象工廠
abstract class AbstractFactory {
    abstract Animal getAnimal(String animal);
    abstract Plant getPlant(String plant);
}

接著建立具體的工廠,繼承自抽象工廠類

//建立具體的工廠AnimalFactory繼承自AbstractFactory
class AnimalFactory extends AbstractFactory {
    public Animal getAnimal(String animal) {
        if ("cat".equals(animal)) {
            return new Cat();
        } else if ("dog".equals(animal)) {
            return new Dog();
        } else if ("rabbit".equals(animal)) {
            return new Rabbit();
        } else {
            return null;
        }
    }

    public Plant getPlant(String plant) {
        return null;
    }
}

//建立具體的工廠PlantFactory繼承自AbstractFactory
class PlantFactory extends AbstractFactory {
    public Plant getPlant(String plant) {
        if("flower".equals(plant)) {
            return new Flower();
        } else if ("tree".equals(plant)) {
            return new Tree();
        } else {
            return null;
        }
    }

    public Animal getAnimal(String animal) {
        return null;
    }
}

建立一個工廠生成器類,通過區分傳遞過來的引數生成具體的工廠類

//建立一個工廠生成器類,通過傳遞的相應引數建立工廠
class FactoryProducer {
    public static AbstractFactory getFactory(String factroyType) {
        if ("animal".equals(factroyType)) {
            return new AnimalFactory();
        } else if ("plant".equals(factroyType)) {
            return new PlantFactory();
        } else {
            return null;
        }
    }
}

使用FactoryProducer抽象工廠生成器類獲取具體的工廠,然後通過具體的工廠獲取不同的物件

public class AbstractFactoryDemo {
    public static void main(String[] args) {
        //先獲取Animal的工廠
        AbstractFactory animalFactory = FactoryProducer.getFactory("animal");
        //通過Animal工廠獲取物件
        Animal cat = animalFactory.getAnimal("cat");
        cat.print();
        Animal dog = animalFactory.getAnimal("dog");
        dog.print();
        Animal rabbit = animalFactory.getAnimal("rabbit");
        rabbit.print();
        //先獲取Plant的工廠
        AbstractFactory plantFactory = FactoryProducer.getFactory("plant");
        //通過Animal工廠獲取物件
        Plant flower = plantFactory.getPlant("flower");
        flower.print();
        Plant tree = plantFactory.getPlant("tree");
        tree.print();
    }
}