Skip to content
类之间的关系

泛化:空心箭头实线(继承非抽象类)

实现:空心箭头虚线(继承抽象类)

聚合:空心菱形实线(整体和部分不是强依赖的,即使整体不存在了,部分仍然存在)

组合:实心菱形实线(强依赖的特殊聚合关系,如果整体不存在了,则部分也不存在了)

关联:直线,默认不强调方向,表示对象间相互知道;如果特别强调方向,加上箭头(对象之间静态的、天然的结构,如乘车人与车票)

依赖:带箭头的虚线(体现为类构造方法及类方法的传入参数,箭头的指向为调用关系)

1、简单工厂模式
2、工厂方法模式

抽象工厂 + 抽象产品 -> 具体工厂 + 具体产品

将创建的具体工厂/对象,赋值给抽象工厂/对象。

java
public class FactoryMethodPattern {
    public static void main(String[] args) {
        try {
            AbstractFactory factory1 = new ConcreteFactory1();
            Product product1 = factory1.newProduct();
            product1.show();

            AbstractFactory factory2 = new ConcreteFactory2();
            Product product2 = factory2.newProduct();
            product2.show();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

//抽象产品:提供了产品的接口
interface Product {
    public void show();
}
//具体产品1:实现抽象产品中的抽象方法
class ConcreteProduct1 implements Product {
    @Override
    public void show() {
        System.out.println("具体产品1显示...");
    }
}
//具体产品2:实现抽象产品中的抽象方法
class ConcreteProduct2 implements Product {
    @Override
    public void show() {
        System.out.println("具体产品2显示...");
    }
}

//抽象工厂:提供了厂品的生成方法
interface AbstractFactory {
    public Product newProduct();
}
//具体工厂1:实现了厂品的生成方法
class ConcreteFactory1 implements AbstractFactory {
    @Override
    public Product newProduct() {
        System.out.println("具体工厂1生成-->具体产品1...");
        return new ConcreteProduct1();
    }
}
//具体工厂2:实现了厂品的生成方法
class ConcreteFactory2 implements AbstractFactory {
    @Override
    public Product newProduct() {
        System.out.println("具体工厂2生成-->具体产品2...");
        return new ConcreteProduct2();
    }
}
3、抽象工厂模式

抽象工厂模式的结构与工厂方法模式的结构相似,不同的是其产品的种类不止一个,所以创建产品的方法也不止一个。

例子:在 Spring源码中的 DefaultListableBeanFactory实现了所有工厂的公共逻辑

java
public class AbstractFactoryPattern {
    public static void main(String[] args) {
        AbstractFactory factory1 = new ConcreteFactory1();
        factory1.newProduct1().show();
        factory1.newProduct2().show();

        System.out.println("================");
        AbstractFactory factory2 = new ConcreteFactory2();
        factory2.newProduct1().show();
        factory2.newProduct2().show();
    }
}

//抽象产品1
interface Product1 {
    public void show();
}
//具体产品11
class ConcreteProduct11 implements Product1 {
    @Override
    public void show() {
        System.out.println("具体产品11显示...");
    }
}
//具体产品12
class ConcreteProduct12 implements Product1 {
    @Override
    public void show() {
        System.out.println("具体产品12显示...");
    }
}

//抽象产品2
interface Product2 {
    public void show();
}
//具体产品21
class ConcreteProduct21 implements Product2 {
    @Override
    public void show() {
        System.out.println("具体产品21显示...");
    }
}
//具体产品22
class ConcreteProduct22 implements Product2 {
    @Override
    public void show() {
        System.out.println("具体产品22显示...");
    }
}

//抽象工厂:提供了厂品的生成方法
interface AbstractFactory {
    Product1 newProduct1();
    Product2 newProduct2();
}
//具体工厂1:实现了厂品的生成方法
class ConcreteFactory1 implements AbstractFactory {
    @Override
    public Product1 newProduct1() {
        System.out.println("具体工厂1生成-->具体产品11...");
        return new ConcreteProduct11();
    }

    @Override
    public Product2 newProduct2() {
        System.out.println("具体工厂1生成-->具体产品21...");
        return new ConcreteProduct22();
    }

}
//具体工厂2
class ConcreteFactory2 implements AbstractFactory {
    @Override
    public Product1 newProduct1() {
        System.out.println("具体工厂2生成-->具体产品12...");
        return new ConcreteProduct12();
    }

    @Override
    public Product2 newProduct2() {
        System.out.println("具体工厂2生成-->具体产品22...");
        return new ConcreteProduct22();
    }
}