Profesyonel Tasarım Desenleri ; Adapter


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication22
{
//Haber servisimiz calısırken yeni bir haber servisi sistemimize gelince gerekli adapte edici sınıfımızı yazıp yeni gelen haber servisini bünyemize
// katıyoruz…
//Gerekli diger acıklamalar diger baslıklar altında var…
interface IHaber
{
DateTime HaberSaat { get; set; }
string Baslik { get; set; }

void HaberEkle();

}

//Eski servisimiz…
class HaberAlServis1 : IHaber
{
private string hbb;
private DateTime hbs;

public DateTime HaberSaat
{
get
{
return hbs;
}
set
{
hbs = DateTime.Now;
}
}

public string Baslik
{
get
{
return hbb;
}
set
{
hbb = value;
}
}

public void HaberEkle()
{
Console.WriteLine(“Haber Alındı ve Eklendi…”);
}
}

//Adapte edilicek yeni haber servisimiz…
class HaberAlServis2
{
public void HaberiEkle()
{
Console.WriteLine(“Servisimizdeki Haberi Aldınız…(Yeni Haber Servisi !)”);
}

}
//HaberAlServis2 yi sistemimize katmak icin adapte edici sınıfımız…
class YeniServisEklendi : IHaber
{

private string hbb;
private DateTime hbs;

private readonly HaberAlServis2 YSH=new HaberAlServis2();

public DateTime HaberSaat
{
get
{
return hbs;
}
set
{
hbs = value;
}
}

public string Baslik
{
get
{
return hbb;
}
set
{
hbb = value;
}
}

public void HaberEkle()
{
YSH.HaberiEkle();
}
}

//İş Akısına bakan sınıfımız…
class HaberIncele
{
private IHaber _IHaber;

public HaberIncele(IHaber hb)
{
_IHaber=hb;
}

public void HaberYap()
{
_IHaber.HaberEkle();
}

}

class Program
{
static void Main(string[] args)
{
var ys=new YeniServisEklendi();
var hi = new HaberIncele(ys);
hi.HaberYap();
//ys.HaberSaat = DateTime.Now;
//Console.WriteLine(ys.HaberSaat);

}
}
}
//İşin özü;Yeni haber servisimizi (Adapte edilicek olan) sistemimize katmak icin ek bir sınıf yazıp (Sistemimize Adapte eden) bunun üzerinden
//işimize devam ediyoruz…

Reklamlar

Profesyonel Tasarım Desenleri ; Prototype


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication19
{

//Prototype Kalıbında degistirmek istedigimiz sınıf üyelerini abstract yaparak ise baslıyoruz,bu sınıf diger sınıflarımız icin ornek ve temel
// özellikleri tasıyıcak ve ayrıca OOP temel kuralına uygun olarak üst sınıflarımıza esneklik sağlıyacak.
//Amaç tek eposta şablonundan farklı durumlar icin epostalar üretmek bunu yaparken new anahtarını kullanmamak zira
// refrans degerler her zaman heap üzerinde masraflı olarak üretilir ve tutulurlar object sınıfının MemberwiseClone üyesi
//new kullanmadan kendisine verilen objenin sığ bir kopyasını üretir burda sığ olması başka bir hafıza //adresinde aynı değerleri taşımaması sadece eski objeyi refrans etmesidir…
// anlamındadır sadece verilen sınıfa isaret eden referansları kopyalar….
//Boylece aynı sınıfı daha az masrafla üretebiliriz….
abstract class Eposta
{
public int Id { get; set; }
public string Baslik { get; set; }
public string Adres { get; set; }

public abstract string Icerik { get; set; }

public abstract Eposta Kopya();

}

class DiniBayram : Eposta
{
private string ic;
//Yeni sınıfımızın referanslarını abtract sınıfımıza atıyoruz boylece new kullanmadan yeni bir nesmemiz oluyor….
public override Eposta Kopya()
{
return (Eposta)this.MemberwiseClone();
}
//Yeni nesnemizde istedigimiz degisiklikleri yaparak eposta icerini degistirebilicegiz….
public override string Icerik
{
get
{
return ic;
}
set
{
ic=value;
}

}
}

class ResmiBayram : Eposta
{
private string ic;

public override Eposta Kopya()
{
return (Eposta)this.MemberwiseClone();
}

public override string Icerik
{
get
{
return ic;
}
set
{
ic=value;
}
}
}

class Duyuru : Eposta
{
private string ic;

public override Eposta Kopya()
{
return (Eposta)this.MemberwiseClone();
}

public override string Icerik
{
get
{
return ic;
}

set
{
ic = value;
}
}
}

class Program
{
static void Main(string[] args)
{

//Bir kez nesnemizi yaratıyoruz bu baska bir nesnede olur ben duyuru olanı seçtim…
Duyuru dy = new Duyuru()
{
Adres=”falanadres@mail.com”,
Baslik=”Sayın Ayhan eren”,
Id=1,
Icerik=”Kuruluşumuzun Özel Gününe Siz de Davetlisiniz…”
};

//Duyuru sınıfını kopyalayarak yeni bir referansları elde ediyoruz bu referansı eposta sınıfı bizin icin tasıyor…

Eposta db = dy.Kopya();
//Hersey duyuru ile aynı  yuzden ozelleştirmek icin gerekli islemleri yapıyoruz…
db.Icerik = (“Dini Bayramınız Kutlu Olsun…”);
Eposta rb = dy.Kopya();
rb.Icerik= (“Bayramınız Kutlu Olsun…”);

List<Eposta> posta = new List<Eposta>();
posta.Add(dy);
posta.Add(db);
posta.Add(rb);

//Tek nesneden birden çok nesne üretik…

foreach (var item in posta)
{
Console.WriteLine(item.Icerik+” “+item.Adres+” “+item.Baslik+” “+item.Id);
}
}
}
}
//İşin özü;new ile yeni sınıf üretmek maliyetlidir eğer iş gereği bunu çok sık ve benzer sınıflar icin yapıcaksanız bu şablonu kullanabilirsiniz…

Profesyonel Tasarım Desenleri ; Factory Method


2169 Mesaj
Bugün; 17:12:09

Profesyonel Tasarım Desenleri ; Factory Method

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication13
{
//Fabrika yazılım kalıbında amaç gerektiği anda gerekli sınıf nesnemizi oluşturmaktır.Ben burda soyut sınıf kullandım arayüzde olabilir…
//Soyut sınıfımızdaki Metedumuzun sipariş veridiğimiz bölümlere göre değiştiğini varsayarak abstract olarak işaretledik…

abstract class Siparisver
{
internal string Departman;
internal string Isim;
internal string Adres;
internal string Siparis;

internal abstract void sMt();
}

//Madem siparişlerde istenenler belli soyut sınıfla temel işlemleri tanımlarız ,boylece turemis sınıflar kolayca eklenir ve bolumler (ürünler) gelismeye
// esnek bir yapı olusturur.OOP da sınıflar gelismeye acık degisime kapalı olmalı…

class Kirtasiye : Siparisver
{

string _departman;
string _isim;
string _adres;
string _siparis;

internal Kirtasiye()
{ }

internal Kirtasiye(Siparisver sp)
{
_departman = sp.Departman;
_isim = sp.Isim;
_adres = sp.Adres;
_siparis = sp.Siparis;
}

internal override void sMt()
{
Console.WriteLine(_departman+” Siparisi Oluştu…”);
}

}

class Elektronik :Siparisver
{
string _departman;
string _isim;
string _adres;
string _siparis;

internal Elektronik()
{

}

internal Elektronik(Siparisver sp)
{
_departman = sp.Departman;
_isim = sp.Isim;
_adres = sp.Adres;
_siparis = sp.Siparis;

}

internal override void sMt()
{
Console.WriteLine(_departman+” Siparisi Oluştu…”);
}

}

enum Bolum
{
Kirtasiye=1,
Bilgisayar=2,
Tanimsiz=3

}

//İs akısımızdaki temel işlevselliği üstelenen asıl sınıfımız icin bir arayuz olusturuyoruz boylece asıl fabrika sınıfımız icin esneklik saglıyoruz
//siparis bilgileri ve departman kodu da siparisi hazırlamak icin gerekli…

interface IFabrika
{

Siparisver SiparisYap(Siparisver spv,Bolum bl);
}

//Zurnanın deligi burası ! Herseyi ustlenen somut sınıfımız yani fabrikamız…
//hem soyut fabrikamız hemde somut olanı temel siparis sınıfı donduruyor boylece departmanlarımız ne olursa olsun temel siparis islemlerini bize
// sağlıyor…
//Yapılıcak tek sey verilen siparis bilgileri ve departman kodu ile, ilgili departmanın kendi siparisini hazırlaması (ASIL Hedef olan ilgili somut urun nesnesinin
//ilgili sınıfca hazırlanması)
class SiparisFabrika : IFabrika
{

public Siparisver SiparisYap(Siparisver spv, Bolum bl)
{

switch (bl)
{
case Bolum.Kirtasiye:
return new Kirtasiye(spv);
case Bolum.Bilgisayar:
return new Elektronik(spv);
default: throw new ArgumentException(“Bu Bolum Henuz Yok…”);

}
}

}

class Program
{
static void Main(string[] args)
{
//Temel siparis bilgilerini hazırlıyoruz ,her sınıf kendi icinde bunu özellestiricektir…
Siparisver sp=new Kirtasiye();
sp.Adres=”İzmir”;
sp.Isim=”Ayhan eren”;
sp.Departman=”Kirtasiye”;
sp.Siparis=”^renkli kalem”;

SiparisFabrika sp1 = new SiparisFabrika();
try
{
var sps= sp1.SiparisYap(sp, Bolum.Kirtasiye);

sps.sMt();
}
catch (ArgumentException e)
{
Console.WriteLine(e.Message);

}

}
}
}
//İşin özü;Fabric yonteminde urun adı verilen bizdeki karsılıgı departmanlar olan urunler icin icin yine Fabric yonteminde karsılıgı Fabrika olan sınıf içinde ürün nesnelerini her istedigimizde hazırlıyoruz…

Dependency Injection ve Loosely Coupling


// C# da Dependency Injection ve Loosely Coupling

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication10
{

#region Bagimlilik çözümü icin kullanılan arayuz
interface IMouse
{
void Write();

}
#endregion

#region Sonradan Ekledik…
class IbmMouse : IMouse
{
public void Write()
{
Console.WriteLine(“IBM Mouse Kullanıldı”);
}
}
#endregion

//İki Faremiz var Logitech
class LogitechMouse:IMouse
{
public void Write()
{
Console.WriteLine(“Logitech Mouse Kullanıldı”);
}
}
//Digeri A4
class A4TechMouse:IMouse
{
public void Write()
{
Console.WriteLine(“A4Tech Mouse Kullanıldı”);
}
}

//İş katmanımız tüm akısı yönetiyor
//ama IBM faresi gelince iş katmanında değisim gerekiyor
//ınıf iceriginin değişimi OOP da istemegen bir konu zira daha yuksek seviyede bu sınıfı kullanan bilesenlerde istenmeyen degisimlere yol acar…
//Madem farelerin temel islevi yazmak bunu saglıyacak Interface tanımlayıp taban sınıflarına tanımlarız boylece
//İş katmanın bu temel sınıflara sıkı sıkıya baglılıgını azaltabiliriz ; gevşek bagımlılık…
//Burda sınıfın kurucusu üzerinden enjekte prensibi uygulanıyor…
class MouseManager
{
private readonly IMouse mos;
internal MouseManager(IMouse ms)
{
mos = ms;
}

public void Use()
{
// IBM faresi girmeden once is katmanımız her sınıfı tanımlamak ve bilmek zorunda….
// LogitechMouse mouse = new LogitechMouse();

//Artık iş katmanımız sadece gerekli bilgi ile donatıldı sınıflar ile ilgisi kesildi…
// tek bilgiği arayuzmuzdeki soyut metot…
mos.Write();
// mouse.Write();
}
}

class Program
{
static void Main(string[] args)
{

// MouseManager manager = new MouseManager();
MouseManager mm = new MouseManager(new IbmMouse());
mm.Use();
}
}
}
// işin özü is katmanımızın bagımlı oldugu iş akısına dısardan mudahele ederek daha zahmetsizce akısı //geliştiriyoruz, OOP temel ilklerinden biride bir sınıfı geliştirmeye acık tutmak ama değiştirmeye //kapamaktır…