java中工廠模式和單例模式詳解
如何將例項化具體類的程式碼從應用中抽離或者封裝起來,使它們不會干擾應用的其他部分?
1:簡單工廠模式:其作用是例項化物件而不需要客戶瞭解這個物件屬於那個具體的子類。 using System; using System.Collections; public class MyClass { public static voidMain() { //通過引數來例項化子類。 IVehicle vehicle =FactoryVehicle.CreateVehicle("car"); vehicle.go(); Console.ReadLine(); } } public class FactoryVehicle { public static IVehicleCreateVehicle(string VehicleName) { switch(VehicleName.ToLower()) { case"car": return newCar(); case"boat": return newBoat(); default: return newCar(); } } } public interface IVehicle { void go(); } public class Car:IVehicle { public void go() { Console.WriteLine("car"); } } public class Boat:IVehicle { public void go() { Console.WriteLine("boat"); } } 2:抽象工廠:即將工廠方法也抽象出來,由具體的子類來例項化工廠。產品建立部分和簡單工廠模式相同。 using System; using System.Collections; public class MyClass { public static voidMain() { //通過定義的工廠來例項化。弊端是當產品很多時需要增加很多的工廠。程式碼重複。 FactoryVehicle factory = new FactoryCar(); IVehicle vehicle =factory.CreateVehicle(); vehicle.go(); Console.ReadLine(); } } public interface FactoryVehicle { IVehicle CreateVehicle(); } public class FactoryCar:FactoryVehicle { public IVehicleCreateVehicle() { return new Car(); } } public class FactoryBoat:FactoryVehicle { public IVehicleCreateVehicle() { return new Boat(); } } public interface IVehicle { void go(); } public class Car:IVehicle { public void go() { Console.WriteLine("car"); } } public class Boat:IVehicle { public void go() { Console.WriteLine("boat"); } }3:反射工廠模式: 其實就是通過反射的方式來獲得具體例項化是那個類。 using System; using System.Collections; using System.Reflection; public class MyClass { public static voidMain() { //使用反射的方法獲得例項化的類 IVehicle vechicle =ReflectFactory.CreateVehicleByReflect("Car"); vechicle.go(); Console.ReadLine(); } } public class ReflectFactory { public static IVehicleCreateVehicleByReflect(string typeName) { Type type = Type.GetType(typeName); ConstructorInfo ci =type.GetConstructor(System.Type.EmptyTypes);; return (IVehicle)ci.Invoke(null); } } public class FactoryBoat:FactoryVehicle { public IVehicleCreateVehicle() { return new Boat(); } } public class FactoryCar:FactoryVehicle { public IVehicleCreateVehicle() { return new Car(); } } public interface FactoryVehicle { IVehicleCreateVehicle(); } public interface IVehicle { void go(); } public class Car:IVehicle { public void go() { Console.WriteLine("car"); } } public class Boat:IVehicle { public void go() { Console.WriteLine("boat"); } }概念: