この本の例は比較的理解しやすいものですが、外国人が書いたものであるため、中国人の特徴にあまり合っていない場合があり、言語習慣も中国語ではありません。もちろん、この本を読んだ後は、デザイン パターンでどのような問題を解決できるか、またどのような問題を解決できないか (たとえば、コーディングの代替にはならない) を深く理解できます。
本のコードの一部を PHP に変更しました。コードを見て概念と組み合わせると、より理解しやすくなるはずです。
戦略モード
コードをコピー コードは次のとおりです:
/**
* 戦略パターン
* は、アルゴリズムのファミリーを定義し、相互に置き換えることができるように個別にカプセル化します。
* このモードでは、アルゴリズムを使用する顧客に関係なくアルゴリズムを変更します。
*/
//フライング動作インターフェイス
インターフェイス FlyBehavior {
public function fly();
}
//クワック動作インターフェイス
インターフェイス QuackBehavior {
public function quack();
}
//翼飛行
class FlyWithWingsimplements FlyBehavior {
public function fly() {
echo "I'm fly!!n";
}
}
//飛べません
class FlyNoWayimplements FlyBehavior {
public function fly() {
echo "飛べません!n"
}
}
class FlyRocketPoweredimplements FlyBehavior {
public function fly() {
echo "ロケットで飛んでいます!n";
}
}
class Qquack QuackBehavior を実装します {
public function quack() {
echo "Quackn";
}
}
class Squeak は QuackBehavior を実装します {
public function quack() {
echo " Squeakn" ;
}
}
class MuteQuack は QuackBehavior を実装します {
public function quack() {
echo ">n";
}
}
抽象クラス Duck {
protected $quack_obj;
protected $fly_obj;
public function PerformQuack(); this- >quack_obj->quack();
}
public function PerformFly() {
$this->fly_obj->fly();
public function swim( ) {
echo "すべてのアヒルは浮きます!n";
}
public function setFlyBehavior(FlyBehavior $fb) {
$this->fly_obj = $fb; >}
public function setQuackBehavior(QuackBehavior $qb) {
$this->gt;quack_obj = $qb;
}
}
class ModelDuck extends Duck {
public function __construct () {
$this->fly_obj = new FlyNoWay();
$this->gt;quack_obj = new MuteQuack();
public function display(); >echo "私はモデル アヒルです!n";
}
}
$model = new ModelDuck();
$model->performFly(); $model ->performQuack();
//新しい機能を提供します
$model->setFlyBehavior(new FlyRocketPowered());
$model->setQuackBehavior(new Squeak()); 🎜 >$model->performFly();
$model->
?>
単体モード
コードをコピーします
コードは次のとおりです:
* シングルトン パターン
* クラスのインスタンスが 1 つだけ存在することを保証し、グローバル アクセス ポイントを提供します。 */ class MyClass { プライベート static $uniqueInstance; プライベート関数 __construct() {
}
パブリック 静的関数 getInstance() {
if (self::$uniqueInstance == null) {
self::$uniqueInstance = new MyClass();
}
return self::$uniqueInstance;
}
}
$myClass = MyClass::getInstance(); 🎜>var_dump($ myClass);
$myClass::getInstance();
var_dump($myClass);
ファクトリ メソッド パターン>
コードをコピー
コードは次のとおりです:
abstract class PizzaStore {
public function orderPizza($type) {
$pizza = $this->createPizza($type);
$pizza->prepare();
$pizza->bake();
$ピザ->カット();
$pizza->box();
$ピザを返します;
}
パブリック抽象関数 createPizza($type);
}
class NYPizzaStore extends PizzaStore {
public function createPizza($type) {
if ($type == "cheese") {
return new NYStyleCheesePizza();
} elseif ($type == "veggie") {
return new NYStyleVeggiePizza();
} elseif ($type == "clam") {
return new NYStyleClamPizza();
} elseif ($type == "papperoni") {
return new NYStylePapperoniPizza();
} else {
null を返します。
}
}
}
class ChicagoPizzaStore extends PizzaStore {
public function createPizza($type) {
if ($type == "cheese") {
新しい ChicagoStyleCheesePizza() を返します。
} elseif ($type == "veggie") {
return new ChicagoStyleVeggiePizza();
} elseif ($type == "clam") {
return new ChicagoStyleClamPizza();
} elseif ($type == "papperoni") {
return new ChicagoStylePapperoniPizza();
} else {
null を返します。
}
}
}
抽象クラス Pizza {
public $name;
パブリック $dough;
パブリック $sauce;
public $toppings = array();
public function prepare() {
echo "準備中 " 。 $this->name 。 「ん」;
エコー「生地を食べます...n」;
echo "ソースを追加しています...n";
echo "トッピングの追加: n";
for ($i = 0; $i
echo " " . $this->トッピング[$i] 。 「ん」;
}
}
public function bakery() {
echo "350n で 25 分間焼きます";
}
public function Cut() {
echo "ピザを斜めのスライスに切りますn";
}
public function box() {
echo "ピザを公式の PizzaStore ボックスに置きますn";
}
public function getName() {
return $this->name;
}
}
class NYStyleCheesePizza extends Pizza {
public function __construct() {
$this->name = "NY スタイル ソースとチーズのピザ";
$this->dough = "薄い生地の生地";
$this->sauce = "マリナラソース";
$this->トッピング[] = "すりおろしたレッジャーノ チーズ";
}
}
class NYStyleVeggiePizza extends Pizza {
public function __construct() {
$this->name = "NY スタイル ソースと野菜のピザ";
$this->dough = "薄い生地の生地";
$this->sauce = "マリナラソース";
$this->toppings[] = "すりおろしたレッジャーノ野菜";
}
}
class NYStyleClamPizza extends Pizza {
public function __construct() {
$this->name = "NYスタイルソースとアサリのピザ";
$this->dough = "薄い生地の生地";
$this->sauce = "マリナラソース";
$this->トッピング[] = "レッジャーノ貝のすりおろし";
}
}
class NYStylePapperoniPizza extends Pizza {
public function __construct() {
$this->name = "NYスタイルソースとパペロニピザ";
$this->dough = "薄い生地の生地";
$this->sauce = "マリナラソース";
$this->トッピング[] = "すりおろしたレッジャーノ パペロニ";
}
}
class ChicagoStyleCheesePizza extends Pizza {
public function __construct() {
$this->name = "シカゴ スタイル ディープ ディッシュ チーズ ピザ";
$this->dough = "極厚クラスト生地";
$this->sauce = "梅トマトソース";
$this->トッピング[] = "細切りモッツァレラチーズ";
}
public function Cut() {
echo "ピザを正方形のスライスに切りますn";
}
}
$myStore = new NYPizzaStore();
$chicagoStore = new ChicagoPizzaStore();
$pizza = $myStore->orderPizza("チーズ");
エコー「イーサンは " を注文しました。」 $pizza->getName() 。 「ん」;
$pizza = $chicagoStore->orderPizza("チーズ");
エコー「イーサンは " を注文しました。」 $pizza->getName() 。 「ん」;
?>
工厂モード
复制代 代码如下:
abstract class PizzaStore {
public function orderPizza($type) {
$pizza = $this->createPizza($type);
$pizza->prepare();
$pizza->bake();
$ピザ->カット();
$pizza->box();
$ピザを返します;
}
パブリック抽象関数 createPizza($type);
}
class NYPizzaStore extends PizzaStore {
public function createPizza($type) {
$pizza = null;
$ingredientFactory = 新しい NYPizzaIngredientFactory();
if ($type == "チーズ") {
$pizza = new CheesePizza($ingredientFactory);
$pizza->setName('ニューヨーク スタイル チーズ ピザ');
} elseif ($type == "veggie") {
$pizza = new VeggiePizza($ingredientFactory);
$pizza->setName('ニューヨークスタイルのベジピザ');
} elseif ($type == "clam") {
$pizza = new ClamPizza($ingredientFactory);
$pizza->setName('ニューヨーク風クラムピザ');
} elseif ($type == "papperoni") {
$pizza = new PapperoniPizza($ingredientFactory);
$pizza->setName('ニューヨークスタイル パパロニピザ');
}
$pizza を返す;
}
}
class ChicagoPizzaStore extends PizzaStore {
public function createPizza($type) {
if ($type == "cheese") {
return new ChicagoStyleCheesePizza();
} elseif ($type == "veggie") {
return new ChicagoStyleVeggiePizza();
} elseif ($type == "clam") {
return new ChicagoStyleClamPizza();
} elseif ($type == "papperoni") {
return new ChicagoStylePapperoniPizza();
} else {
null を返します。
}
}
}
interface PizzaIngredientFactory {
public function createDough();
パブリック関数 createSauce();
パブリック関数 createCheese();
パブリック関数 createVeggies();
パブリック関数 createPepperoni();
パブリック関数 createClam();
}
class NYPizzaIngredientFactoryimplements PizzaIngredientFactory {
public function createDough() {
return new ThinCrustDough();
}
public function createSauce() {
return new MarinaraSauce();
}
public function createCheese() {
return new ReggianoCheese();
}
public function createVeggies() {
$veggies = array(
new Garlic(),
new Onion(),
new Mushroom(),
new RedPepper ()、
);
$veggies を返します;
}
public function createPepperoni() {
return new SlicedPepperoni();
}
public function createClam() {
return new FreshClams();
}
}
class ChicagoPizzaIngredientFactoryimplements PizzaIngredientFactory {
public function createDough() {
return new ThickCrustDough();
}
public function createSauce() {
return new PlumTomatoSauce();
}
public function createCheese() {
return new Mozzarella();
}
public function createVeggies() {
$veggies = array(
new BlackOlives(),
new Spinach(),
new EggPlant(),
);
$veggies を返します;
}
public function createPepperoni() {
return new SlicedPepperoni();
}
public function createClam() {
return new FrozenClams();
}
}
抽象クラス Pizza {
public $name;
パブリック $dough;
パブリック $sauce;
パブリック $veggies = array();
パブリック $cheese;
パブリック $pepperoni;
パブリック $clam;
パブリック抽象関数 prepare();
public function bakery() {
echo "350n で 25 分間焼きます";
}
public function Cut() {
echo "ピザを斜めのスライスに切りますn";
}
public function box() {
echo "ピザを公式の PizzaStore ボックスに置きますn";
}
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
}
public function __toString() {
}
}
class CheesePizza extends Pizza {
public $ingredientFactory;
パブリック関数 __construct(PizzaIngredientFactory $ingredientFactory) {
$this->ingredientFactory = $ingredientFactory;
}
public function prepare() {
echo "準備中 " 。 $this->name 。 「ん」;
$this->dough = $this->ingredientFactory->createDough();
$this->sauce = $this->ingredientFactory->createSauce();
$this->cheese = $this->ingredientFactory->createCheese();
}
}
class ClamPizza extends Pizza {
public $ingredientFactory;
パブリック関数 __construct(PizzaIngredientFactory $ingredientFactory) {
$this->ingredientFactory = $ingredientFactory;
}
public function prepare() {
echo "準備中 " 。 $this->name 。 「ん」;
$this->dough = $this->ingredientFactory->createDough();
$this->sauce = $this->ingredientFactory->createSauce();
$this->cheese = $this->ingredientFactory->createCheese();
$clam = $this->ingredientFactory->createClam();
}
}
$nyPizzaStore = new NYPizzaStore();
$nyPizzaStore->orderPizza('cheese');
?>

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 中国語版
中国語版、とても使いやすい

ドリームウィーバー CS6
ビジュアル Web 開発ツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!
