创建模式---静态工厂,工厂方法和抽象工厂

静态工厂

静态工厂也叫简单工厂,类图如下
这里写图片描述
产品类:

public interface Product {
    public void print();
}
public class ConcreteProduct implements Product {
    @Override
    public void print() {
        System.out.println(this.getClass().getName());
    }
}

工厂类:

public class Creator {
    public static Product getConcreteProduct() {
        return new ConcreteProduct();
    }
    public static void main(String[] args) {
        Product product = Creator.getConcreteProduct();
        System.out.println(product);
    }
}

其实最常见的静态工厂就是单立模式,只不过工厂类和产品类是一个类而已

工厂方法

工厂方法的核心是将工厂和产品都进行了抽象,然后具体的工厂对应具体的产品
工厂方法类图:
这里写图片描述
图中产品1有工厂1生成,产品2由工厂2生成
产品类:

public interface Product {
    public void print();
}
public class ConcreteProduct1 implements Product {
    @Override
    public void print() {
        System.out.println(this.getClass().getName());
    }
}
public class ConcreteProduct2 implements Product {
    @Override
    public void print() {
        System.out.println(this.getClass().getName());
    }
}

工厂类:

public class Product1Factory implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProduct1();
    }
}
public class Product2Factory implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProduct2();
    }
}

使用类:

public static void main(String[] args) {
        Factory factory1= new Product1Factory();
        Product product1 = factory1.createProduct();
        product1.print();
        Factory factory2= new Product2Factory();
        Product product2 = factory2.createProduct();
        product2.print();
    }

抽象工厂

抽象工厂是在工厂方法的基础上进行产品的多样化
这里写图片描述
每一个工厂都需要创建产品1和产品2两种产品
产品类:

public interface Product1 {
    public void print1();
}
public class ConcreteProduct11 implements Product1 {
    @Override
    public void print1() {
        System.out.println("print1:" + this.getClass().getName());
    }
}
public class ConcreteProduct12 implements Product1 {
    @Override
    public void print1() {
        System.out.println("print1:" + this.getClass().getName());
    }
}

public interface Product2 {
    public void print2();
}
public class ConcreteProduct21 implements Product2 {
    @Override
    public void print2() {
        System.out.println("print2:" + this.getClass().getName());
    }
}
public class ConcreteProduct22 implements Product2 {
    @Override
    public void print2() {
        System.out.println("print2:" + this.getClass().getName());
    }
}

工厂类:
每一个工厂都需要创建两种产品

public interface Factory {
    public Product1 createProduct1();

    public Product2 createProduct2();
}
public class ProductFactory11 implements Factory {
    @Override
    public Product1 createProduct1() {
        return new ConcreteProduct11();
    }

    @Override
    public Product2 createProduct2() {
        return new ConcreteProduct21();
    }
}
public class ProductFactory12 implements Factory {
    @Override
    public Product1 createProduct1() {
        return new ConcreteProduct12();
    }

    @Override
    public Product2 createProduct2() {
        return new ConcreteProduct22();
    }
}

使用类:
分别创建两套产品,还可以将使用类封装起来,直接获取产品组合

public static void main(String[] args) {
        //第一大类产品创建
        Factory factory1= new ProductFactory11();
        Product1 product11 = factory1.createProduct1();
        Product2 product21 = factory1.createProduct2();
        product11.print1();
        product21.print2();

        //第二大类产品创建
        Factory factory2= new ProductFactory12();
        Product1 product12 = factory2.createProduct1();
        Product2 product22 = factory2.createProduct2();
        product12.print1();
        product22.print2();
    }

抽象工厂类太多,如果不是有系列产品需要创建,不建议使用抽象工厂

猜你喜欢

转载自blog.csdn.net/weixin_43060721/article/details/82154004