工厂模式
在简单工厂模式中竟然还要传参数,才能创建一个实例,而且实例的种类越来越多的时候 工厂的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