<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>adamczuk.net.pl &#187; Wzorce projektowe</title>
	<atom:link href="http://adamczuk.net.pl/kategoria/wzorce-projektowe/feed/" rel="self" type="application/rss+xml" />
	<link>http://adamczuk.net.pl</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Tue, 20 Jul 2010 16:48:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Wzorzec projektowy Fabryka abstrakcyjna</title>
		<link>http://adamczuk.net.pl/2010/02/04/wzorzec-projektowy-fabryka-abstrakcyjna/</link>
		<comments>http://adamczuk.net.pl/2010/02/04/wzorzec-projektowy-fabryka-abstrakcyjna/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 23:00:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>
		<category><![CDATA[design patern]]></category>
		<category><![CDATA[factory]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=263</guid>
		<description><![CDATA[Poprzedni wpis dotyczył wzorca projektowego Singleton, który jest niezbędny w przypadku pojedynczych obiektów tego samego typu. Obecny tekst porusza problem tworzenia różnych obiektów jednego typu (tej samej rodziny) bez specyfikowania ich konkretnych klas.
Fabryka abstrakcyjna
Plusem wykorzystania wzorca fabryki abstrakcyjnej jest możliwość ukrycia szczegółów implementacyjnych klas reprezentujących dany produkt. W ten sposób klient widzi tylko interfejs. Ukryte [...]]]></description>
			<content:encoded><![CDATA[<p>Poprzedni wpis dotyczył wzorca projektowego Singleton, który jest niezbędny w przypadku pojedynczych obiektów tego samego typu. Obecny tekst porusza problem tworzenia różnych obiektów jednego typu (tej samej rodziny) bez specyfikowania ich konkretnych klas.<span id="more-263"></span></p>
<h3>Fabryka abstrakcyjna</h3>
<p>Plusem wykorzystania wzorca fabryki abstrakcyjnej jest możliwość ukrycia szczegółów implementacyjnych klas reprezentujących dany produkt. W ten sposób klient widzi tylko interfejs. Ukryte zostają również nazwy klas, co odizolowuje klienta od problemu określenia, do której klasy należy obiekt.</p>
<pre><code>&lt;?php
interface IUser {
	function getName();
}

class User implements IUser {
	public function __construct($id) { }

	public function getName() {
		return 'Jacek';
	}
}

class UserFactory {
	public static function create($id) {
		return new User($id);
	}
}
?&gt;</code></pre>
<p>Klasa <code>User</code> zaprezentowana powyżej implementuje interfejs <code>IUser</code>, który zawiera metodę <code>getName()</code>. Tworzenie nowego obiektu użytkownika odbywa się poprzez statyczną metodę <code>create()</code>. Szczegóły tworzenia użytkowników ukryte są w klasie <code>User</code> fabryki.</p>
<h3>Podsumowanie</h3>
<p>Istnieje prosta metoda sprawdzenia czy klasa działa poprawnie.</p>
<pre><code>&lt;?php
$oUser = UserFactory::create(1);
echo($oUser->getName());
?&gt;</code></pre>
<p>Poniższy wydruk pokazuje, że dokładnie tak się dzieje.</p>
<pre><code>Jacek</code></pre>
<p>Wzorzec projektowy fabryki abstrakcyjnej kładzie nacisk na tworzenie produktów z konkretnej rodziny. </p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2010/02/04/wzorzec-projektowy-fabryka-abstrakcyjna/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wzorzec projektowy Singleton</title>
		<link>http://adamczuk.net.pl/2010/01/30/wzorzec-projektowy-singleton/</link>
		<comments>http://adamczuk.net.pl/2010/01/30/wzorzec-projektowy-singleton/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 23:21:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>
		<category><![CDATA[design patern]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=250</guid>
		<description><![CDATA[Wzorzec projektowy Singleton. Wyjaśnienie idei oraz implemntacja w PHP.]]></description>
			<content:encoded><![CDATA[<p>Wzorce projektowe to ogólne rozwiązania częstych informatycznych problemów. Programowanie obiektowe w PHP5 różni się nie tylko składnią, ale również pewnymi brakami w porównaniu z innymi językami, typu C++ czy Java. Pomimo tego wzorce projektowe idealnie sprawdzają się w aplikacjach internetowych.<span id="more-250"></span></p>
<p>Częsta sytuacja, z jaką spotykają się programiści to współdzielenie zasobów. Wszystkie zapytania do bazy danych wymagają połączenia. Taki uchwyt może być wykorzystany wielokrotnie przez różne zapytania przy tym samym żądaniu. Otwieranie i zamykanie połączeń jest najzwyczajniej, mało ekonomiczne.</p>
<h3>Singleton</h3>
<p>Istnieje proste rozwiązanie tego problemu. Singleton to wzorzec projektowy, który zwraca istniejącą instancję obiektu. Jeśli taka instancja nie istnieje wówczas jest tworzona. Idea rozwiązania jest bardzo prosta i idealnie pasuje do naszego problemu. Poniżej znajduje się kod klasy <code>DB</code>, która dziedziczy z klasy <code>Singleton</code> i tworzy takie połączenie do bazy.</p>
<p>Prawidłowa struktura klas, co zasugerował <a href="http://adamczuk.net.pl/2010/01/30/wzorzec-projektowy-singleton/comment-page-1/#comment-5526">Wasacz</a> w komentarzach, wymaga dziedziczenia klasy <code>DB</code> po ogólnej klasie wzorca <code>Singleton</code>. Niestety nie mam pomysłu zogranizowanie klasy wzorca poza pustymi metodami i jedną zmienną.</p>
<pre><code>&lt;?php
abstract class Singleton {
	protected static $_instance;

	protected function __construct() { }

	public static function instance() { }
}

class DB extends Singleton {
	private $_conn;

	private function __construct($conf) {
		$this->_conn = mysql_connect($conf['host'], $conf['user'], $conf['pass']) or die($this->error());
	}

	public static function instance($conf=null) {
		if (is_null(self::$_instance)) {
			self::$_instance = new DB($conf);
		}
		return self::$_instance;
	}
}
?&gt;</code></pre>
<p>Klasa <code>DB</code> zaprezentowana powyżej nie jest skomplikowana. Zawiera jednak tylko niezbędne metody, prezentujące działanie klasy. Niemożliwe jest stworzenie egzemplarza klasy <code>DB</code>, ponieważ konstruktor jest prywatny. Dostęp do obiektu możliwy jest poprzez publiczną, statyczną metodę <code>instance()</code>.</p>
<h3>Podsumowanie</h3>
<p>Istnieje prosta metoda sprawdzenia czy klasa działa poprawnie. Próba pobrania obiektu klasy <code>DB</code> powinna zwrócić ten sam zasób.</p>
<pre><code>&lt;?php
print_r(DB::instance());
print_r(DB::instance());
?&gt;</code></pre>
<p>Poniższy wydruk pokazuje, że dokładnie tak się dzieje.</p>
<pre><code>DB Object
(
    [_conn:private] => Resource id #11
)
DB Object
(
    [_conn:private] => Resource id #11
)</code></pre>
<p>Wzorzec projektowy Singleton stosuje się bez względu na stopień skomplikowania aplikacji. Rozwiązanie to jest wygodniejsze i elastyczniejsze niż przechowywanie uchwytu do bazy danych w zmiennej globalnej.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2010/01/30/wzorzec-projektowy-singleton/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
