First, define an interface named idatabase. In this interface, define the method name, parameters, and return values of database operations. In this case, I define the following methods:
Public interface idatabase
{
Bool connect (string connectstring );
Bool open ();
Bool command (string SQL );
Void close ();
}
Important Note: "The interface should be cautious throughout its life, and its definition should not be confused." You must carefully compile the interface and repeat parameters and return values. Why? Because all the implementation classes must be written according to the interface specification, that is, the interface definition is public. Once the interface is changed, the consequence is that all implementation classes must be adjusted accordingly.
Then, you need to write the specific implementation class. You need to define the implementation classes of the idatabase as to the number of different types of databases required by the customer. Although the workload is a little heavy, but when you see a smile satisfied with the customer, you will have a kind of heartfelt happiness. Well, the sqlserver implementation class code is as follows:
Public class sqlserver: idatabase
{
Sqlconnection conn;
Sqlcommand command;
Public bool connect (string connectstring)
{
Try
{
Conn = new sqlconnection (connectstring );
Return true;
}
Catch (sqlexception)
{
Return false;
}
}
Public bool open ()
{
Try
{
Conn. open ();
Return true;
}
Catch (sqlexception)
{
Return false;
}
}
Public bool command (string SQL)
{
Try
{
Command = new sqlcommand (SQL, Conn );
Command. executenonquery ();
Return true;
}
Catch (sqlexception)
{
Return false;
}
}
Public void close ()
{
Conn. Close ();
Conn. Dispose ();
}
}
Haha, it's a little long. After reading it with a bit of teeth, you will feel very comfortable. If you feel this way now, please make persistent efforts to write specific code for the Oracle implementation class, if you are free, just draw a prototype:
Public class ORACLE: idatabase
{
Public Oracle ()
{
}
Public bool connect (string connectstring)
{
Return true;
}
Public bool open ()
{
Return true;
}
Public bool command (string SQL)
{
Return true;
}
Public void close ()
{
}
}
Well, it's good. If you have many types of databases, write different implementation-class code. I won't go into details here. What about next? Smart readers will surely think of this question: how can this interface be used with so many implementation classes? Let's define another class called factory, which decides which database to choose for operation. This class is relatively simple:
Public class factory
{
Public static idatabase selectdatabase (string databasetype)
{
Switch (databasetype)
{
Case "sqlserver ":
Return new sqlserver ();
Case "oracle ":
Return new Oracle ();
Default:
Return new sqlserver ();
}
}
}
Do you understand? Well, we should make a distinguished, always-noble customer appear. Only him can decide which database to use, as you can see:
Public class client
{
Public static void main ()
{
// Get the database information from web. config.
String dbtype = configurationsettings. receivettings ["dbtype"];
String dbconnectstring = configurationsettings. deleettings ["dbconn"];
Idatabase DB = factory. selectdatabase (dbtype );
// Connect the selected database.
If (db. Connect (dbconnectstring) = false)
{
Console. writeline ("the database {0} Can @ # t be connected.", dbtype );
Return;
}
// Open Database.
If (db. open () = false)
{
Console. writeline ("the database {0} Can @ # t be opened, the connect string is {1}.", dbtype, dbconnectstring );
Return;
}
// Execute SQL command.
String SQL = "Update order set price = price * 0.07 where productid =@# 002 @#";
If (db. Command (SQL ))
{
// Do something...
}
Else
{
Console. writeline ("the operator is not success. SQL statament is {0}", SQL );
DB. Close ();
Return;
}
DB. Close ();
}
}
Okay, the project is complete. Do you understand?
Question: What are the application scenarios and limitations of simple factories?
Assignment question: If you want to develop a multimedia player that can be played by both window mediaplayer and RealPlayer, and QuickTime, Which player should be selected by the customer, draw a UML diagram and write the code.