28 Aralık 2008 Pazar

Prototype Design Pattern

Evet bu yazmızın konusu Prototype design pattern.Daha önce anlattığım patternlar gibi bu pattern da bir creational pattern.Buradaki amacımız ise ilgili nesnelerin belirli bir prototiplerini oluşturmak ve daha sonra oluşturacağımız nesneleri bu prototipleri kullanarak oluşturmak.UML diagramı ise şu şekilde ...


Yukarıda gördüğümüz gibi base bir prototipimiz var ve bu prototiplere göre yeni concreteprototipleri türetiyoruz.
Kodlar ise şu şekilde...

abstract class PrototypeBase:ICloneable

{

abstract public object Clone();

}


class Prototype1:PrototypeBase

{

public int deger1;

public override object Clone()

{

return this.MemberwiseClone();

}

public override string ToString()

{

return "Deger1 =" + deger1;

}

}


class Prototype2:PrototypeBase

{

public double deger2;

public override object Clone()

{

return this.MemberwiseClone();

}

public override string ToString()

{

return "Deger2=" + deger2;

}

}


class Collection

{

List<PrototypeBase> list = new List<PrototypeBase>();

public void AddList(params PrototypeBase[] type)

{

foreach(PrototypeBase prototype in type)

list.Add(prototype);

}

public PrototypeBase Copy(int index)

{

return list[index].Clone() as PrototypeBase;

}

public PrototypeBase this[int index]

{

get { return list[index]; }

}

}


static void Main(string[] args)

{

Collection collection = new Collection();

Prototype1 p1 = new Prototype1() { deger1 = 1 };

Prototype2 p2 = new Prototype2() { deger2 = 12.3 };

Prototype1 p3 = new Prototype1() { deger1 = 3 };

Prototype2 p4 = new Prototype2() { deger2 = 16.9 };

collection.AddList(p1, p2, p3, p4);

PrototypeBase base1 = collection.Copy(1);

Console.WriteLine(base1.ToString());

PrototypeBase base2 = collection[0].Clone() as PrototypeBase;

Console.WriteLine(base2.ToString());

Prototype1 prototype = base2 as Prototype1;

prototype.deger1 = 10;

Console.WriteLine(prototype.ToString());

Console.WriteLine(collection[0].ToString());

Console.ReadLine();

}


PrototypeBase sınıfından Prototype1 ve Prototype2 sınıflarını türetiyoruz.Bu sınıfların içerisinde de Clone metodunu implement ediyoruz.Collection sınıfı bütünlük oluşturmak için tanımlanmış ve birtakım özel metodlar eklenmiştir.Kullanımları bu şekilde olacak diye bir kısıt yoktur. Main metotta ise nesnelerimizi yaratıyoruz.Daha sonra collectiondaki tipleri prototip olarak kabul ederek onları kullanarak yeni nesneler türetiyoruz.Yukarıdaki prototype değişkenin değeri 10 ile değiştirelerek collectiondaki aynı nesne olmadığı gösterilmiştir.Ekran görüntüsü ise şu şekilde olacaktır...

Kolay Gelsin...

27 Aralık 2008 Cumartesi

Factory Method design Pattern

Factory Method design patternı creational patterndır.Amaç nesne yaratımını client tan saklamaktır.Ayrıca factory method patternı aralarında hiyerarşik olarak yani kalıtımsal olarak ilişkide olan nesneleri yaratmak için kullanılır.
Öncelikle ilişkili sınıflarımızı yazarsak:

public abstract class Product

{

public int deger

{

get;

set;

}

}


class ProductA:Product

{

}


class ProductB:Product

{

}


abstract class Creator

{

public abstract Product CreateProduct();

}


class CreatorA:Creator

{

public override Product CreateProduct()

{

return new ProductA();

}

}


class CreatorB:Creator

{

public override Product CreateProduct()

{

return new ProductB();

}

}


  • Main Metot

static void Main(string[] args)

{

Product p;

Creator c;

String type = Console.ReadLine();

if (type == "ProductA")

{

c = new CreatorA();

p = c.CreateProduct();

}

else

{

c = new CreatorB();

p = c.CreateProduct();

}

Console.WriteLine(p.GetType().ToString());

Console.ReadLine();

}


Program burada Console'dan aldığı parametreye göre ilgili nesneyi üretir ve tipini console'a yazar.Creator sınıfı eğer default bir üretim olacaksa abstract olarak tanımlanmayabilir.Bunun yerine CreateProduct() metodu virtual olarak tanımlanır.Ayrıca pattern bu durumda pek mantıklı görünmeyebilir.Ancak her nesne yaratımında birçok işlem yapılabileceğini düşünürsek tüm bu ayrıntılar clienttan soyutlanmış olacaktır.

Singleton Design Pattern

Uzun süredir sınavlar,dersler,iş derken bir türlü birşeyler yazamadım.:)
Konumuz Design Patternlar. Design Patternlar yazılımda yapılacak olan bazı spesifik işlemleri tanımlayan belirli şablonlardır.Bu şablonlara bağlı kalınarak istenilen işlemler yapılır.Design patternlar ayrıca yazılımda esneklik ve yeniden kod kullanılabilirlik sağlarlar.
Şimdi anlatacağım design pattern Singleton. Singleton patternındaki amaç programımızda bulunacak olan bir nesneyi sadece birkez yaratmak ve bu yaratılan nesneye de çeşitli yerlerden rahatça ulaşmaktır.Oluşturacağımız sınıfın UML diagramı şu şekildedir.
Buradaki getInstance metoodu static olarak tanımlanacak ve oluşturulan nesneyi döndürecektir.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Singleton

{

class Singleton

{

private static Singleton instance;

private static int data = 0;

public static Singleton getInstance()

{

if (instance == null)

instance = new Singleton();

return instance;

}

public void setData(int deger)

{

data = deger;

}

public int getData()

{

return data;

}

}

}


  • Main Metot ise


static void Main(string[] args)

{

Singleton yeni = Singleton.getInstance();

yeni.setData(10);

Console.WriteLine(yeni.getData());

yeni = null;

yeni = Singleton.getInstance();

Console.WriteLine(yeni.getData());

Console.ReadLine();

}


Burada Singleton sınıfından getInstance içinde nesnemiz birkez yaratılmaktadır.Referansa null değer atasak bile Singleton sınıfı içinde nesnemiz saklı olduğu için getInstance metodu ile yine aynı nesne dönmektedir.Amaçlarımızdan biri de bu nesneye heryerden ulaşmaktı.Bunu da metodu static yaparak sağlamış oluyoruz.

21 Aralık 2008 Pazar

CETURK JAVA Teknolojileri Etkinliği Ankara














CETURK Java Teknolojileri Ankara Etkinliği (3 Ocak 2009 Cumartesi)
Bugüne kadar gerçekleþtirdiði bir çok etkinlikle üyelerine ve biliþim sektörünün geliþmesine katkýda bulunan CETURK baþkentimiz Ankara'da yapacaðý büyük bir organizasyon ile karþýmýzda.
CETURK , 3 Ocak Cumartesi günü Çankaya Üniversitesi Mavi Salon'da "CETURK Java Teknolojileri Ankara Etkinliði" inde Java dünyasýný bir araya getiriyor. Java dünyasýndaki en son teknolojilerin ve geliþmelerin anlatýlacaðý etkinlikte Java dünyasýnýn önemli isimleri , Kenan Sevindik, Melih Sakarya, Özcan Acar ve Ümit Vardar sunum yapacaklar.





















Melih Sakarya JBoss Seam
Ümit Vardar JPA ve Hibernate
Kenan Sevindik Spring Framework'e Giriş
Özcan Acar Apache Wicket Framework
PANEL Java Dünyası ve Türkiye

Ayrıntılı bilgi ve kayıt için tıklayınız

4 Aralık 2008 Perşembe

LINQ to XML(XLINQ=> XML Language Integrated Query) Bölüm 2

Evet bu makale XML sorgularına giriş yapıyoruz.Bu sorgulamaları yaparken kullandığımız sınıflar için bir önceki makalemi inceleyebilirsiniz.Öncelikle XML sorgusuna başlarken örnek bir XML dökümanı oluşturuyoruz.Bunun için ben Microsoft'un sitesindeki örnek XML dökümanlarından biri olan PurchaseOrders.xml dosyasını aldım.

XDocument doc=XDocument.Load("PurchaseOrders.xml"); ile doc nesnesine öncelikle elementimizi yüklüyoruz.Böylece artık XML belgemiz belleğe yerleşti.
  • Yapacağımız ilk sorgu PurchaseOrder'ın içerisinde yer alan PurchaseOrderNumber'ı listeletmek olacak.
Bunun için yazacağımız sorgu şu olacaktır:
var purchase = from p in doc.Element("PurchaseOrders").Elements("PurchaseOrder")
select p.Attribute("PurchaseOrderNumber");

Burada yaptığımız işlem öncelikle doc nesnesindeki PurchaseOrders olan root elementine gitmek.Daha sonra ise bu root elementte bulunanan PurchaseOrder elementlerine ulaşıyoruz.PurchaseOrder tagı artık birden fazla olduğu için burada yapacak işlemlerimiz bu kadar.Daha sonra select bölümünde p'nin de PurchaseOrderNumber attribute'unu alıyoruz.Şuan purchase içerisinde PurchaseOrderNumber'lar bulunuyor.Bundan sonra yapacağımız, bu numaraları foreach döngüsü ile ekrana yazdırmak yada kullanmak.

foreach (var number in purchase)
{
Console.WriteLine(number.Value);
}
  • 2.sorgumuz ise daha karmaşık olacak.Burda yaptığımız ise adresleri içerisindeki elementlerle beraber sorgulamak olacak.Bunun için:
var purchases = from p in doc.Element("PurchaseOrders").Elements("PurchaseOrder")
let adres = p.Element("Address")
select new
{
Type = adres.Attribute("Type").Value,
Name = adres.Element("Name").Value,
Street = adres.Element("Street").Value,
City = adres.Element("City").Value,
State = adres.Element("State").Value,
Zip = adres.Element("Zip").Value,
Country = adres.Element("Country").Value
};

Öncelikle birinci örnekte olduğu gibi purchaseorder elementine yine erişiyoruz. let anahtar kelimesiyle bir değişken gibi tanımlama yapıyoruz.Böylece sorgumuzu uzun ve anlaşılması daha zor olmaktan kurtarıyoruz.Daha sonra bir anonymous tip yaratarak bu bilgileri tipin içine atıyoruz.Bilgileri kullnırken yine foreach ile alabiliriz.Ayrıca foreach içerisinde var ile tanımladığımız değişkene intellisense ile baktığımızda tanımladığımız tüm değişkenleri görebiliyoruz.


  • Son sorgumuz ise where anahtar kelimesinin kullanımı ile ilgili.Burada ise Adres elementi içerisndeki Ad elementinin 'E' başlayan değerleri bulacağız.Burada yazacağımız sorgu yukarıdakilerden daha kolay olacak:
var city = from p in doc.Element("PurchaseOrders").Elements("PurchaseOrder")
let name = p.Element("Address").Element("Name")
where name.Value[0] == 'E'
select name.Value;
where ile baş harfi kontrol ederek istediğimiz elementleri alabiliyoruz.

Programın tüm kodlarına buradan ulaşabilirsiniz.
Kolay Gelsin