<?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>Sun, 06 May 2012 22:34:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Wzorzec projektowy Strategia</title>
		<link>http://adamczuk.net.pl/2012/02/10/wzorzec-projektowy-strategia/</link>
		<comments>http://adamczuk.net.pl/2012/02/10/wzorzec-projektowy-strategia/#comments</comments>
		<pubDate>Fri, 10 Feb 2012 21:19:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Wzorce projektowe]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[pattern]]></category>
		<category><![CDATA[strategy]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=578</guid>
		<description><![CDATA[Definicja i opis działania wzorca projektowego Strategia]]></description>
			<content:encoded><![CDATA[<p>Programowanie obiektowe w dużej mierze opiera się na wzorcach projektowych. Często nie zdajemy sobie nawet sprawy, że dany sposób postępowania czy rozwiązanie problemu nosi nazwę takiego wzorca projektowego.<span id="more-578"></span></p>
<p><strong>Strategia</strong> to czynnościowy wzorzec projektowy, który hermetyzuje algorytmy z danej rodziny w postaci klas. Jeśli taka definicja brzmi skomplikowanie to diagram UML wyjaśnie wszelkie wątpliwości.</p>
<p><a href="http://adamczuk.net.pl/wp-content/uploads/2012/02/strategy-design-pattern-pl.png"><img src="http://adamczuk.net.pl/wp-content/uploads/2012/02/strategy-design-pattern-pl.png" alt="Diagram UML wzorca projektowego strategia" title="strategy-design-pattern-pl" width="650" height="536" class="alignnone size-full wp-image-579" /></a></p>
<p>Często okazuje się, że dziedziczenie jest niewystarczającym sposobem tworzenia oprogramowania. Wtedy z pomocy przychodzi inne techniki projektowania aplikacji.</p>
<p>Strategia definiuje wspólny interfejs dla każdego obsługiwanego algorytmu. Wymusza to na nas stworzenie implementacji obsługiwanych funckji w klasach dostarczających konkretne algorytmy. Klasa, która korzysta z tych algorytmów, ustawia referencję do aktualnie używanej strategii poprzez motodę <code>ustawStrategie()</code>. Jeśli klient zmienia algorytm danej strategii, wiąże się to z ustwieniem nowej strategii dla klienta. Analogicznie tworzenie następnych algorytmów nie wymaga ingerencji w klasy klienta, ani interfejsu, a jedynie stworznia nowej strategii implementującej znany interfejs.</p>
<p>Wzorzec strategii opiera swoje działanie na kompozycji i delegacji, a nie dziedziczeniu. Dzięki temu unikamy mało elastycznych instrukcji warunkowych w klasie klienta, który wybiera dany algorytm. Poszczególne strategie mogą być zmieniane w trakcie działania programu, co daje korzyści w postaci różnego zużycia zasobów lub złożoności obliczeniowej. Takie rozwiązanie ma też swoje wady w postaci narzutu komunikacji między klientem i strategią, a także większą liczę utworzonych obiektów. Jednak moim zdaniem to mały koszt w stosunku do przytoczonych zalet.</p>
<p>Przykładowe wykorzytanie tego wzorca w PHP opiszę szerzej w artykule dotyczącym wsparcia generowania tabel XHTML.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2012/02/10/wzorzec-projektowy-strategia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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 [...]]]></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>5</slash:comments>
		</item>
	</channel>
</rss>

