The Factory Pattern
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.
Leave a Comment