Okey, voy a poner mi ejemplo ...
 
Tengo mis carpetas así 
Model
--datos 
--------UsuarioMemory
--------UsuarioXML
--entities
--------Usuario
--interfaces
--------IUsuarioService
--UsuarioModel 
Lo que e aplicado es la inyección de dependencia ... ya que mi aplicativo puede consumir ya sea de una base de datos, un XML, o de la memoria sin tener que cambiar su lógica de negocio, solo debe cambiar su repositorio, es decir la dependencia inyectada. 
Las clases 
model/Entities/Usuario   
Código PHP:
Ver originalclass Usuario {
    private $_id;
    private $_nombre;
    private $_apellido;
    private $_dni;
    
    public function get_id() { return $this->_id; }
    public function get_nombre() { return $this->_nombre; }
    public function get_apellido() { return $this->_apellido; }
    public function get_dni() { return $this->_dni; }
    public function set_id($x) { $this->_id = $x; }
    public function set_nombre($x) { $this->_nombre = $x; }
    public function set_apellido($x) { $this->_apellido = $x; }
    public function set_dni($x) { $this->_dni = $x; }
}
  
model/Datos/UsuarioXML   
Código PHP:
Ver original<?php
class UsuarioXML {
    
    private $_sxe;
    
    public function __construct(){
        $this->_sxe = new SimpleXMLElement('usuario.xml', NULL, TRUE);
    }
    public function listar(){
        foreach($this->_sxe as $u){
            $usuario = new Usuario();
            
            $usuario->set_id((int)$u->id);
            $usuario->set_nombre((string)$u->nombre);
            $usuario->set_apellido((string)$u->apellido);
            $usuario->set_dni((string)$u->dni);
            
            $usuarios[] = $usuario;
        }
        
        return $usuarios;
    }
    public function registrar(Usuario $usuario){
        $u = $this->_sxe->addChild('usuario');
        
        $u->addChild('id', $this->_sxe
->count() + 1);         $u->addChild('nombre', $usuario->get_nombre());
        $u->addChild('apellido', $usuario->get_apellido());
        $u->addChild('dni', $usuario->get_dni());
        
        $this->save();
    }
    public function actualizar(Usuario $usuario){
        foreach($this->_sxe as $u){
            if($u->id == $usuario->get_id()){
                $u->nombre   = $usuario->get_nombre();
                $u->apellido = $usuario->get_apellido();
                $u->dni      = $usuario->get_dni();
                break;
            }
        }
        
        $this->save();
    }
    public function eliminar($id){
        $i = 0;
        foreach($this->_sxe as $k => $u){
            if($u->id == $id){
                $dom->parentNode->removeChild($dom);
                break;
            }
            $i++;
        }
        $this->save();
    }
    public function obtener($id){
        $usuario = new Usuario();
        foreach($this->_sxe as $u){
            if($u->id == $id){      
                $usuario->set_id((int)$u->id);
                $usuario->set_nombre((string)$u->nombre);
                $usuario->set_apellido((string)$u->apellido);
                $usuario->set_dni((string)$u->dni);
                break;
            }
        }
        
        return $usuario;
    }
    private function save(){
        $fo = fopen('usuario.xml','w');         fwrite($fo, $this->_sxe
->asXML());     }
}
  
model/interfaces/IUsuarioService  
Código PHP:
Ver originalinterface IUsuarioService {
    public function setInjection($rp);
    
    public function listar();
    public function registrar(Usuario $usuario);
    public function actualizar(Usuario $usuario);
    public function eliminar($id);
    public function obtener($id);
}
  
  
model/UsuarioModel   
Código PHP:
Ver originalclass UsuarioModel implements IUsuarioService {
 
    private $_Repossitory;
 
    public function setInjection($rp){
        $this->_Repossitory = $rp;
    }
 
    public function listar(){
        return $this->_Repossitory->listar();
    }
    public function registrar(Usuario $usuario){
        $this->_Repossitory->registrar($usuario);
    }
    public function actualizar(Usuario $usuario){
        $this->_Repossitory->actualizar($usuario);
    }
    public function eliminar($id){
        $this->_Repossitory->eliminar($id);
    }
    public function obtener($id){
        return $this->_Repossitory->obtener($id);
    }
 
}
  
Y ahora lo implemento asi   
Código PHP:
Ver original$um = new UsuarioModel();
$um->setInjection(new UsuarioXML());
 
$usuarios = $um->listar();
  
En caso que nuestro proyecto ya no requiera el uso de los XML, simplemente cambiar su repositorio a UsuarioDB, o UsuarioTXT, o UsuarioMemoria 
Esta bien lo que planteo?