팩토리 클래스는 다른 객체를 생성하는 데 특별히 사용되는 메서드를 포함하는 클래스를 말합니다. 팩토리 클래스는 클래스의 동적 교체, 구성 수정을 허용하고 일반적으로 애플리케이션을 만드는 데 중요합니다. 고급 PHP 개발자가 팩토리 패턴에 더욱 유연하고 능숙해지는 것이 중요합니다.
팩토리 패턴은 일반적으로 유사한 인터페이스를 준수하는 다양한 클래스를 반환하는 데 사용됩니다. 팩토리의 일반적인 용도는 다형성 공급자를 생성하여 애플리케이션 논리 또는 구성 설정에 따라 인스턴스화해야 하는 클래스를 결정할 수 있도록 하는 것입니다. 예를 들어, 애플리케이션의 다른 부분을 리팩터링할 필요 없이 새 확장 이름을 사용하도록 해당 공급자를 사용하여 클래스를 확장할 수 있습니다.
일반적으로 팩토리 패턴에는 기본적으로 Factory라는 이름의 정적 메서드가 있지만 이는 원칙일 뿐이며 이 정적 메서드는 임의로 이름을 지정할 수도 있습니다. 모든 데이터의 매개변수를 허용합니다. 객체를 반환해야 합니다.
기본 팩토리 클래스
1 2 3 4 5 6 7 8 9 10 11 | class MyObject{
}
class MyFactory{
public static function factory(){
return new MyObject():
}
}
$instance =MyFactory::factory();
|
로그인 후 복사
팩토리 클래스를 사용하여 이미지 파일 구문 분석
Php 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | <?php
interface IImage{
function getHeight();
function getWidth();
function getData();
}
class Image_PNG implements IImage{
private $_width , $_height , $_data ;
public function __construct( $file ){
$this ->_file= $file ;
$this ->_parse();
}
private function _parse(){
}
public function getWidth(){
return $this ->_width;
}
public function getHeight(){
return $this ->_height;
}
public function getData(){
return $this ->_data;
}
}
class Image_JPEG implements IImage{
private $_width , $_height , $_data ;
public function __construct( $file ){
$this ->_file= $file ;
$this ->_parse();
}
private function _parse(){
}
public function getWidth(){
return $this ->_width;
}
public function getHeight(){
return $this ->_height;
}
public function getData(){
return $this ->_data;
}
}
class ImageFactory{
public static function factory( $file ){
$pathParts = pathinfo ( $file );
switch ( strtolower ( $pathParts ['extension']))
{
case 'jpg':
$ret = new Image_JPEG( $file );
break ;
case 'png':
$ret = new Image_PNG( $file );
break ;
default :
}
if ( $ret instanceof IImage){
return $ret ;
} else {
}
}
}
|
로그인 후 복사
Php 코드
1 2 3 4 | $image =ImageFactory::factory('/path/to/my.jpg');
echo $image ->getWidth();
|
로그인 후 복사
팩토리 클래스를 사용하여 데이터베이스 이식성 문제를 해결하세요. 데이터베이스 애플리케이션에서 팩토리 패턴은 다음 두 가지 측면에서 작동할 수 있습니다.
1. 소프트웨어가 사용자 기반을 확장하기 위해 다양한 데이터베이스 플랫폼을 더 쉽게 지원할 수 있도록 합니다.
2. 소프트웨어가 내부적으로 사용되며 데이터베이스를 수정해야 하는 경우 애플리케이션을 변경할 수 있습니다. 쉽게 다른 플랫폼으로 값 이동
코드에서 User라는 데이터베이스 테이블이 생성되어 이를 테스트합니다. 이 테이블은 email
<🎜이라는 varchar 유형 필드를 정의합니다. >
PHP 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <?php
interface IDatabaseBindings{
public function userExists( $email );
}
class PGSQL implements IDatabaseBindings{
protected $_connection ;
public function __construct(){
$this ->_connection=pg_connect('dbname=example_db');
}
public function userExists( $email ){
$emailEscaped =pg_escape_string( $email );
$query ="select 1 from users where email='". $emailEscaped ."'";
if ( $result =pg_query( $query , $this ->_connection)){
return (pg_num_rows( $result )>0)?true:false;
} else {
return false;
}
}
}
class MYSQL implements IDatabaseBindings{
protected $_connection ;
public function __construct(){
$this ->_connection=mysql_connect('localhost');
mysql_select_db('example_db', $this ->_connection);
}
public function userExists( $email ){
$emailEscaped =mysql_real_escape_string( $email );
$query ="select 1 from users where email='". $emailEscaped ."'";
if ( $result =mysql_query( $query , $this ->_connection)){
return (mysql_num_rows( $result )>0)?true:false;
} else {
return false;
}
}
}
class DatabaseFactory{
public static function factory(){
$type =loadtypefromconfigfile();
switch ( $type ){
case 'PGSQL':
return new PGSQL();
break ;
case 'MYSQL':
return new MYSQL();
break ;
}
}
}
|
로그인 후 복사
애플리케이션은 어떤 유형의 데이터베이스에 연결되어 있는지 알 필요가 없으며, PHP에서 정의한 규칙에 따라 팩토리에서 반환된 인스턴스만 직접 처리합니다. IDatabaseBindings 인터페이스.
PHP 코드
1 2 3 | $db =DatabaseFactory::factory();
$db ->userExists('person@example.com');
|
로그인 후 복사
PHP에서 팩토리 패턴 사용과 관련된 추가 기사 PHP 중국어 홈페이지를 주목해주세요!