概要
class Animal {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}class Factory {public static Animal creatAnimal(String type) {Animal animal = null;switch (type) {case "cat":animal = new Cat();break;case "dog":animal = new Dog();break;default:}return animal;}}class Dog extends Animal {public Dog() {setName("dog");}}class Cat extends Animal {public Cat() {setName("cat");}}public class SimpleFactoryDesign {public static void main(String[] args) {Animal animal = Factory.creatAnimal("cat");System.out.println(animal.getName());animal = Factory.creatAnimal("dog");System.out.println(animal.getName());}}
工厂方法
- 将工厂类的创建延迟到子类(解决了增加子类直接修改工厂方法)
class Animal {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}class Dog extends Animal {public Dog() {setName("dog");}}class Cat extends Animal {public Cat() {setName("cat");}}abstract class AbstractFactory {abstract Animal creatAnimal();public void getName() {System.out.println(creatAnimal().getName());}}class DogFactory extends AbstractFactory {@OverrideAnimal creatAnimal() {return new Dog();}}class CatFactory extends AbstractFactory {@OverrideAnimal creatAnimal() {return new Cat();}}public class FactoryMethodDesign {public static void main(String[] args) {AbstractFactory catFactory = new CatFactory();AbstractFactory dogFactory = new DogFactory();catFactory.getName();dogFactory.getName();}}
抽象工厂
- 工厂生产多类产品
- 新增产品,要创建对应的工厂
abstract class Animal {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}abstract class Plant {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}class Dog extends Animal {public Dog() {setName("dog");}}class Cat extends Animal {public Cat() {setName("cat");}}class Pine extends Plant {public Pine() {setName("pine");}}class Cypress extends Plant {public Cypress() {setName("cypress");}}abstract class Factory {abstract Animal creatAnimal();abstract Plant creatPlant();}class Factory1 extends Factory {@OverrideAnimal creatAnimal() {return new Dog();}@OverridePlant creatPlant() {return new Pine();}}class Factory2 extends Factory {@OverrideAnimal creatAnimal() {return new Cat();}@OverridePlant creatPlant() {return new Cypress();}}public class AbstractFactoryDesign {public static void main(String[] args) {Factory factory1 = new Factory1();System.out.println(factory1.creatAnimal().getName());System.out.println(factory1.creatPlant().getName());Factory factory2 = new Factory2();System.out.println(factory2.creatAnimal().getName());System.out.println(factory2.creatPlant().getName());}}
总结
- 首先从简单工厂进化到工厂方法,是因为工厂方法弥补了简单工厂对修改开放的弊端,即简单工厂违背了开闭原则。
- 从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。
