The Factory pattern provides a standard way for a class to create objects of other classes. The typical use for this is when you have a function that should return objects of different classes, depending on its input parameters. One of the major challenges in migrating services to a different database is finding all the places where the old wrapper object is used and supplying the new one. For example, say you have a reporting database that is backed against an Oracle database that you access exclusively through a class called DB_Oracle_Reporting: class DB_Oracle_Reporting extends DB_Oracle { /*
and because you had foresight DB_Oracle uses our standard database API. class DB_Oracle implements DB_Connection { /* ...
Scattered throughout the application code, whenever access to the reporting database is required, you have wrapper instantiations like this: $dbh = new DB_Oracle_Reporting; If you want to cut the database over to use the new wrapper DB_Mysql_Reporting, you need to track down every place where you use the old wrapper and change it to this: $dbh = new DB_Mysql_Reporting; A more flexible approach is to create all your database objects with a single factory. Such a factory would look like this: function DB_Connection_Factory($key)
{
switch($key) {
case "Test":
return new DB_Mysql_Test;
case "Prod":
return new DB_Mysql_Prod;
case "Weblog":
return new DB_Pgsql_Weblog;
case "Reporting":
return new DB_Oracle_Reporting;
default:
return false;
}
}
Instead of instantiating objects by using new, you can use the following to instantiate objects: $dbh = DB_Connection_factory("Reporting");
Now to globally change the implementation of connections using the reporting interface, you only need to change the factory.
blog comments powered by Disqus |