设计模式-工厂模式

90 阅读1分钟

工厂模式

在简单工厂模式中竟然还要传参数,才能创建一个实例,而且实例的种类越来越多的时候 工厂的case也越来越多,也就是说当我们有个新的属性的实例来的时候,我们就需要在工厂方法能增加一个case,使之能生产这种实例,这等于不但对扩展开放,对修改也开放了。违背了开放-封闭原则。

使用工厂模式,由用户来决定使用哪个工厂 生产哪个实例,即有个抽象工厂,其余具体的工厂实现抽象工厂的接口,再由具体的工厂生产实例,用户也不必传参数了。

示例

factory:

public interface MyDBFactory {
    MyDB produce();
}
public class ElasticSearchFactory implements MyDBFactory{

    @Override
    public MyElasticSearchDB produce() {
        return new MyElasticSearchDB();
    }
}
public class GraphFactory implements MyDBFactory{
    @Override
    public MyGraphDB produce() {
        return new MyGraphDB();
    }
}
public class Neo4jFactory implements MyDBFactory{
    @Override
    public MyNeo4jDB produce() {
        return new MyNeo4jDB();
    }
}

DB

abstract class MyDB {
    public String store(String store){
        return store;
    }
}
public class MyElasticSearchDB extends MyDB{
    @Override
    public String store(String store) {
        return "I am MyElasticSearch";
    }
}
public class MyGraphDB extends MyDB{
    @Override
    public String store(String store) {
        return "I am GraphDB";
    }
}
public class MyNeo4jDB extends MyDB{
    @Override
    public String store(String store) {
        return "I am Neo4j";
    }
}

Test

public class Test {
    public static void main(String[] args){
        MyNeo4jDB myNeo4jDB = new Neo4jFactory().produce();
        System.out.println(myNeo4jDB.store("aaa"));
        MyGraphDB myGraphDB = new GraphFactory().produce();
        System.out.println(myGraphDB.store("aaa"));
        MyElasticSearchDB myElasticSearchDB = new ElasticSearchFactory().produce();
        System.out.println(myElasticSearchDB.store("aaa"));
    }
}

print:
I am Neo4j
I am GraphDB
I am MyElasticSearch

欢迎大家关注我的公众号

image.png