工厂模式

Product:抽象产品角色,它定义了这个产品的通用属性,相当于模子,它定义了一些功能,这些功能可以由子类去实现

ConcreteProduct:具体产品角色,它实现了抽象产品所定义的功能,每个 ConcreteProduct 相当于一个产品种类

Factory:抽象工厂,它定义了所有工厂都应该具有的功能

ConcreteFactory:具体工厂模式类,它实现了抽象工厂定义的所有功能,负责创建具体的产品,它根据这个工厂的具体实现来生产具体的产品,但是这个产品也都具有符合抽象产品类定义的功能

Client:

package design.pattern.factory;

public class Client {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactory();
        try {
            System.out.println(factory.getProduct(ProductType.PA));
            System.out.println(factory.getProduct(ProductType.PB));
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("NO SUCH PRODUCT");
        }
    }
}

Factory:

public interface Factory {
    public Product getProduct(ProductType product) throws Exception;
}

Product:

package design.pattern.factory;

public abstract class Product {
    protected String type;
    
    protected Product(String type) {
        this.type = type;
    }
    
    @Override
    public String toString() {
        return type;
    }
}

ConcreteFactory:

package design.pattern.factory;

public final class ConcreteFactory implements Factory {

    @Override
    public Product getProduct(ProductType product) throws Exception {
        switch (product) {
        case PA:
            return new ConcreteProductA("ConcreteProductA");
        case PB:
            return new ConcreteProductB("ConcreteProductB");
        case PC:
            return new ConcreteProductC("ConcreteProductC");
        default:
            throw new Exception();
        }
    }

}

ConcreteProductA:

package design.pattern.factory;

public final class ConcreteProductA extends Product {
    
    public ConcreteProductA(String type) {
        super(type);
    }
    
}

ConcreteProductB:

package design.pattern.factory;

public final class ConcreteProductB extends Product{
    public ConcreteProductB(String type) {
        super(type);
    }
}

ConcreProductC:

package design.pattern.factory;

public final class ConcreteProductC extends Product{
    public ConcreteProductC(String type) {
        super(type);
    }
}

ProductType:

package design.pattern.factory;

public enum ProductType {
    PA,PB,PC;
}
原文地址:https://www.cnblogs.com/m2492565210/p/7245679.html