Design Patterns in .Net

62

description

 

Transcript of Design Patterns in .Net

Page 1: Design Patterns in .Net
Page 2: Design Patterns in .Net
Page 3: Design Patterns in .Net
Page 4: Design Patterns in .Net
Page 5: Design Patterns in .Net
Page 6: Design Patterns in .Net
Page 7: Design Patterns in .Net
Page 8: Design Patterns in .Net

System.Activator

Page 9: Design Patterns in .Net

public class C {public C() { … }

}

public class C {public static C NewC() {return new C();

}}

Page 10: Design Patterns in .Net

private

base() this()

Page 11: Design Patterns in .Net

class PersonFactory {public Person MakePerson(int age)

{if (age < 18)return new Minor();

elsereturn new Adult();

}}

Page 12: Design Patterns in .Net

string.Format(“<person name=\”{0}\”, name)

XElement(“person”,XAttribute(“name”, name)).ToString();

Page 13: Design Patterns in .Net
Page 14: Design Patterns in .Net

StringBuilder AppendFormat()AppendLine()

Util.AppendFormatLine(stringBuilder, format, params)

stringBuilder.AppendFormatLine(format, params)

stringBuilder.AppendFormat(“… {0}”, params, Environment.NewLine)

Page 15: Design Patterns in .Net
Page 16: Design Patterns in .Net

MemberwizeClone

ICloneable

Clone()

ToString() GetHashCode()

Page 17: Design Patterns in .Net

[Serializable]

public abstract class IPrototype<T>

{public T DeepCopy()

{

MemoryStream stream = new MemoryStream();

BinaryFormatter formatter = new BinaryFormatter();

formatter.Serialize(stream, this);

stream.Seek(0, SeekOrigin.Begin);

T copy = (T)formatter.Deserialize(stream);

stream.Close();

return copy;

}

}

Page 18: Design Patterns in .Net

DeepCopyIPrototype<T>

WeakReference

Page 20: Design Patterns in .Net

public class C{ private C() { /* nothing here */ }

class CMaker {static CMaker () { }internal static readonly C instance = new C();

}

public static C Instance {get { return CMaker.instance; }

}}

Page 21: Design Patterns in .Net

x:Static

Page 22: Design Patterns in .Net
Page 23: Design Patterns in .Net
Page 24: Design Patterns in .Net

Randomclass RandomGenerator {

public Random GetRandom() {return new Random(); // not what I want

}}

interface IRandom {int RandomNumber();

}

Page 25: Design Patterns in .Net

RandomGenerator

IRandom

class RandomAdapter:RandomGenerator, IRandom

{int RandomNumber() {

return GetRandom().Next();}

}

Page 26: Design Patterns in .Net

– RandomGenerator rg = new RandomGenerator();Random r = rg.GetRandom();

– IRandom rand = new Adapter();int n = rand.RandomNumber();

Page 27: Design Patterns in .Net
Page 28: Design Patterns in .Net

– class C { … }

– class CCollection : Collection<C> { … }

class CContainer {private Collection<C> items;

}

Page 29: Design Patterns in .Net

class Neuron { … }

class Layer : Collection<Neuron>{ … }

neuron.ConnectTo(otherNeuron);neuron.ConnectTo(layer);layer.ConnectTo(neuron);layer.ConnectTo(otherLayer);

Page 30: Design Patterns in .Net

– IEnumerable<T>yield return this;

ICollection<T>

Page 31: Design Patterns in .Net
Page 32: Design Patterns in .Net

♣ ♠ ♥ ♦

CardInPlayCard

RankSuit

RankSuit

Orientation

Page 33: Design Patterns in .Net
Page 34: Design Patterns in .Net

IA IB

A B

Page 35: Design Patterns in .Net
Page 36: Design Patterns in .Net

Page 37: Design Patterns in .Net
Page 38: Design Patterns in .Net

new

Bitmapbyte[]

Page 40: Design Patterns in .Net
Page 41: Design Patterns in .Net
Page 42: Design Patterns in .Net
Page 43: Design Patterns in .Net
Page 44: Design Patterns in .Net

XElement.Parse

Page 45: Design Patterns in .Net

IEnumerable<T>

yield returnGetEnumerator()

AsyncEnumerator

Page 46: Design Patterns in .Net
Page 47: Design Patterns in .Net
Page 48: Design Patterns in .Net
Page 49: Design Patterns in .Net

Page 50: Design Patterns in .Net
Page 51: Design Patterns in .Net

interface ICarState{void Go(Context ctx); // Drive?

}

Page 52: Design Patterns in .Net

class Context {ICarState state;public void GoGoGo() {state.Go(this);state.Go(this); // yeah, right :)state.Go(this);

}}

Page 53: Design Patterns in .Net

class CrashedState : ICarState{void Go(Context ctx){ MessageBox.Show(“Are you crazy?”);

}}

class MovingState : ICarState{void Go(Context ctx){// driving// is that a rock?

// CRASH!ctx.state = new CrashedState();

}}

The state just

changed!

Page 54: Design Patterns in .Net
Page 55: Design Patterns in .Net
Page 56: Design Patterns in .Net

interface IStrategy{void Evaluate(Context ctx);

}

SingleEvaluator, ParralelEvaluator, GpuEvaluator

Page 57: Design Patterns in .Net

class Context {IStrategy strategy;Matrix m1, m2;static void Multiply(Matrix m1, Matrix m2){ this.m1 = m1; this.m2 = m2;if (strategy == null) { // on-demand

if (gpu.pixelShader >= 2.0)strategy = new GpuStrategy();

else if (Environment.ProcessorCount > 1)strategy = new ParallelStrategy();

else strategy = new SingleStrategy();}strategy.Evaluate(this);

}}

Page 58: Design Patterns in .Net

Page 59: Design Patterns in .Net

StringBuilder

Page 60: Design Patterns in .Net
Page 61: Design Patterns in .Net
Page 62: Design Patterns in .Net