PHPで簡単なファクトリパターンのデモを作成しようとしています。私のコードがベストプラクティスかどうかはわかりません。コードが重複しているようですが、どうすれば改善できるかわかりません。基本的には、ベーシック、プレミアム、vipの3種類のアカウントを作成したいと思います。お知らせ下さい。どうもありがとう。
抽象クラス
abstract class User {
function __construct() {
$this->db= new Database('mysql','localhost','mvcdb','root','');
}
abstract function checkUser();
function showAccountCredit(){
return $this->credits;
}
function getUserName(){
return $this->username;
}
}
私は3つの異なるユーザーアカウントタイプを持っています:
ベーシックアカウント
class BasicUser extends User {
function __construct($username) {
parent::__construct();
$this->username=$username;
$this->credit='10';
$this->accountType='Basic Account';
$data=$this->checkUser();
if(!empty($data)){
echo 'The username: '.$this->username.' already exists<br>';
return false;
}
$array=array('username'=>$this->username, 'password'=>'password','credit'=> $this->credit,'accountType'=>$this->accountType);
$this->db->insert('user',$array);
}
function checkUser(){
$array=array(':username'=>$this->username);
$results=$this->db->select('SELECT * FROM USER WHERE username=:username',$array);
if(!empty($results)){
$this->credit=$results[0]['credit'];
$this->accountType=$results[0]['accountType'];
}
return $results;
}
function showAccountCredit() {
echo 'Username: '.$this->username.'<br>';
echo 'Account Credit: '.$this->credit.'<br>';
echo 'Account Type: '.$this->accountType;
}
}
プレミアムアカウント
class PremiumUser extends User {
function __construct($username) {
parent::__construct();
$this->username=$username;
$this->credit='100';
$this->accountType='Premium Account';
$data=$this->checkUser();
if(!empty($data)){
echo 'The username: '.$this->username.' already exists<br>';
return false;
}
$array=array('username'=>$this->username, 'password'=>'password','credit'=> $this- >credit,'accountType'=>$this->accountType);
$this->db->insert('user',$array);
}
function checkUser(){
$array=array(':username'=>$this->username);
$results=$this->db->select('SELECT * FROM USER WHERE username=:username',$array);
if(!empty($results)){
$this->credit=$results[0]['credit'];
$this->accountType=$results[0]['accountType'];
}
return $results;
}
function showAccountCredit() {
echo 'Username: '.$this->username.'<br>';
echo 'Account Credit: '.$this->credit.'<br>';
echo 'Account Type: '.$this->accountType.'<br>';
}
}
VIPアカウント:
class VipUser extends User {
function __construct($username) {
parent::__construct();
$this->username=$username;
$this->credit='1000';
$this->accountType='VIP Account';
$data=$this->checkUser();
if(!empty($data)){
echo 'The username: '.$this->username.' already exists<br>';
return false;
}
$array=array('username'=>$this->username, 'password'=>'password','credit'=> $this->credit,'accountType'=>$this->accountType);
$this->db->insert('user',$array);
}
function checkUser(){
$array=array(':username'=>$this->username);
$results=$this->db->select('SELECT * FROM USER WHERE username=:username',$array);
if(!empty($results)){
$this->credit=$results[0]['credit'];
$this->accountType=$results[0]['accountType'];
}
return $results;
}
function showAccountCredit() {
echo 'Username: '.$this->username.'<br>';
echo 'Account Credit: '.$this->credit.'<br>';
echo 'Account Type: '.$this->accountType;
}
}
UserFactoryクラス
class UserFactory {
static function create($username,$accountType){
$accountType = strtolower($accountType);
switch($accountType){
case 'basic': return new BasicUser($username);
case 'premium':return new PremiumUser($username);
case 'vip': return new VipUser($username);
default :return new BasicUser($username);
}
}
index.php
$user1= UserFactory::create('Jerry', 'Vip');
$user1->showAccountCredit();
$user2= UserFactory::create('Bob', 'Basic');
$user2->showAccountCredit();
$user3= UserFactory::create('Betty', 'premium');
$user3->showAccountCredit();