Bu desen Factory Method desenine çok benzer. Amaç yine aynıdır. Sistemden nesnelerin oluşma işini soyutlar. Abstract Factory benzer özellikleri olan nesne fabrikalarını gruplar. İçinde birden fazla fabrika vardır.
Örneğimizde birden fazla türde database’de kaydetme ve sorgulama işlemlerini gruplamak için soyut fabrikayı kullanıyoruz : 
Kısaca kodlarına da bakalım :
Yazının Devamı »
Bu tasarım deseni nesne oluşturma işini sistemden ayırır ve aldığı parametreye göre nesneleri oluşturarak kullanıcıya geri döner.
Bir örnek verecek olursak düşünün ki gezmeye giderken farklı yöntemleriniz olsun. Ben şimdilik iki tane kullanacağım : Araba ve Bisiklet. Bu iki sınıf “Yöntem” arayüzümüzden türemişler. Bir adet de YöntemFabrika’mız var.
{
void Gez();
}
Araba.cs
{
{
MessageBox.Show(”arabayla geziyorum”);
}
}
Bisiklet.cs
{
{
MessageBox.Show(”bisikletle geziyorum”);
}
}
YöntemFabrikası.cs
{
{
return new Araba();
else if(opt==”bisikletle”)
return new Bisiklet();
return new Araba();//if’lere girmezse
}
}
ve kullanacağımız yer
Yöntem y = new YöntemFabrikası().yöntemYarat(parametre );
y.Gez();
Türkçe’ye Tek Nesne olarak çevrilen bu tasarım desenindeki ana amaç bir nesnenin yalnızca bir kez oluşturulabilmesidir. Buna neden ihtiyaç duyarız sorusuna gelince mesela bir bağlantıyı dinleyen nesneniz olsun. Bunu ikince kez yaratmak kimi zaman sorunlara yol açabilir. Sonuçta bunlar sonsuz threadlerdir. Onun yerine bu nesne bir kez yaratılsın ve ihtiyaç duyulduğu zaman daha önce oluşan nesne oraya gitsin ve işlerini halletsin isteriz.
Şimdi biz bu örnekte bir adet RandomSayiVerici oluşturduk. Özellikle Random sınıfını kullandım çünkü özellikle yani başlan bir çok kişi bu sınıfın sürekli aynı sayı ürettiğini düşünüyor. Ama kaçırdıkları şey sınıfı sürekli baştan yaratmaları. Ve bunun bir döngü içinde olduğu düşünülürse mikro saniyeler seviyesinde sayı değişimi çok da fazla olmayacaktır. İstenilen yerde :
Hani oyunlarda şifreler olur ya bu da windows’un enteresan ve kullanışlı bir şifresi diyebiliriz. Yazdığınızda bütün ayarların tek bir elde toplanması bayağı bir işe yarıyor.
Şİmdi bir klasör oluşturun ve adını :
koyun. Göreceksiniz ki simgesi değişecek. İçine girdiğinizde ise normal yollardan bulunması çok zor olan bir çok ayar artık elinizin altında.
Düşünün ki 100′lerce sayfadan oluşan bir siteniz var ve hepsinde belli yerler sabit. Örnek verecek olursak menüler genelde sabit olur ya da en altta yer alan açıklamalar vs. gibi. Bunların içinde bir yerde değişiklik yapmanız gerektiğinde hepsini tekrar düzenlemeniz gerekiyordu önceleri. Fakat masterpage kavramının gelmesiyle bu sorun ortadan kalktı. Artık sabit olan tarafları masterpage içinde yaratıp normal içerik sayfaları bu masterpage’i kullanarak türeyebiliyor. Sanki yeni gibi anlatıyorum ama bu çıkalı bayağı bir oluyor
hemen küçük bir örnekle konumuzu özetleyelim :
MasterPage.master
Defalut1.aspx
Default2.aspx
Java ile kolay bir kalıtım örneği yapalım. Car isminde bir arabanın sahip olabileceği temel özelliklere sahip bir ana class yaratalım ve bu classtan kalıtımla türettiğimiz özelleşmiş arabalar oluşturalım. Öncelikle Car classımızı yazalım. Temel olarak bir arabaya hız, fiyat ve renk özelliklerini kazandıralım.
public class Car {
int speed;
double regularPrice;
String color;
//constructorda bu değerleri initialize edelim
public Car(int speed,double regularPrice,String color){
this.speed=speed;
this.regularPrice=regularPrice;
this.color=color;
}
//main fonksiyonunda arabanın fiyatına erişebileceğimiz bir metod yazalım
public double getSalePrice(){ return regularPrice; }
}
Daha sonra bu classtan türetilmiş kendi içinde farklı özellikleri olan farklı arabalar (subclasslar) üretelim.
Bir tane Car classını kalıtımla alan Sedan tipinde araba classı üretelim. Bu araba tipinde temel araba özelliklerinin yanında bir de uzunluğunu belirleyebilelim ve sedanın fiyatını, uzunluğu 20den büyükse 5% indirimli değilse %10 indirimli hale getirelim.
Kısaca bir bakalım neymiş bu “swing” kütüphanesi. Aslında windowsform’larda sıkça karşılaştığımız button, label vs. gibi objeleri barındıran bir kütüphanedir. Biraz da kodlayalım bakalım :
//Gerekli kütüphaneleri ekliyoruz
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;
public class SwingExample {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
//Penceremizi oluşturuyoruz
JFrame f = new JFrame(”swing örnek”);
Şimdi asıl olay şu yaptığımız bir programdan diğer açık olan program pencerelerini nasıl kontrol ederiz? Tabiki user32 DLL’i ile
[DllImport("user32.dll")]
public static extern int FindWindow(
string lpClassName, // class name
string lpWindowName // window name
);
Bu fonksiyon bizim açık olan programı buluyor ve bize onun Windows altındaki ID’sini veriyor. Tabiki “windows name” parametresine programın tam adının yazılması gerekli.
[DllImport("user32.dll")]
public static extern int SetForegroundWindow(
int hWnd // handle to window
);
Burası ise biraz önceki ID değerini alarak, bu ID’ye sahip olan pencereyi ön tarafa getiriyor.
[DllImport("user32.dll")]
public static extern int SendMessage(
int hWnd, // handle to destination window
uint Msg, // message
int wParam, // first message parameter
int lParam // second message parameter
);
Bu fonksiyonla ise açık olan pencereye mesaj gönderebiliyoruz. Mesela klavyeye dokunmadan notpad’i aktif yapıp oraya birşeyler yazabiliriz ![]()
Gerisi sizin hayal gücünüze ve yapmak istediklerinize kalmış. Sormak istediğiniz bir şey varsa çekinmeyin hemen sorun. Mümkün olan en kısa sürede cevaplamaya çalışacağım.
İyi çalışmalar..
Merhaba Arkadaşlar,
IDE olarak vaz geçilmezim VS. Bu aralarda 2010 üzerinde çalışamaları artırdılar. Peki ben size desemki şimdi bir IDE var ve web üzerinden size istediğiniz tipte proje oluşturmanızı sağlıyor. bununla yetinmezmiş gibi intellisense ve diğer özelliklerede sahip, hadi be oradan seslerini duyar gibiyim. buyrun deneyin benim hoşuma gitti. http://www.coderun.com/ide/
MDI formlarda child formun iki kere açılmasını önlemek için singleton tasarım desenini kullanacağız. MDI form olarak tanımlanmış formumuz Form1 olsun. Bunun içinde açacağımız child form ise Form2 olsun. Form1de herhangi bir şekilde Form2 çağrıldığında sadece bir tane instance oluşturarak bir tane açılmasını istiyorum. Bunun için Form2nin classına şu kodu yazalım.
|
static Form2 myform; public static Form2 Myform() {
if (myform == null) { myform = new Form2(); } return myform;
} |
if (myform == null) yazmamız burada çok önemli. Form2nin sadece bir tane nesnesi oluşturulsun istiyoruz ve bu nesne daha önce oluşturulmamışsa yani null ise oluştur diyoruz. Bu şekilde buraya singleton desenini uyguladık. Daha sonra Form1 den bir buton eventından veya buna benzer herkangi bir şeyden Form2 yi çağırırken şu kodu yazıyoruz.
|
Form2 yeni = Form2.Myform(); yeni.MdiParent = this; yeni.Show(); yeni.Activate(); |
Form2nin nesnesini oluştururken new Form2() diye değil de Form2.Myform() diye oluşturduk buna dikkat edelim. En son olarak da Form2nin kapanış eventına bi kod cümlesi daha eklememiz gerekiyor.
|
private void Form2_FormClosing(object sender, FormClosingEventArgs e) { myform = null; } |
Bunu yazmazsak nesnesini oluşturup açtığımız Form2yi kapatıp tekrar açmak istediğimizde bir hatayla karşılaşırız. Bunu engellemek için bu cümleciği yazıyoruz. Nedeni form nesnemizi bir kere oluşturabilmek üzere oluşturduk ve bunun için “nesne null ise yarat” dedik. Bu yüzden nesneyi null yapmadan tekrardan oluşturamayız. Dolayısıyla form kapatılırken nesneye null değerini atıyoruz ki istediğimizde Form2yi tekrardan yaratabilelim.
