工厂方法模式
工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪个类,工厂方法使一个类的实例化延迟到其子类。结构图如下,
工厂方法模式与简单工厂模式的区别,简单工厂模式只有一个工厂,工厂方法模式对每个产品都有相对应的工厂。
代码示例
//产品
public abstract class Product{
public String productName;
}
//具体的产品
public class FristProduct : Product{
public FristProduct (){
productName = "FristProduct";
}
}
public class SecondProduct : Product{
public SecondProduct (){
productName = "SecondProduct ";
}
}
public class OneProduct : Product{
public FristProduct (){
productName = "OneProduct ";
}
}
public class TwoProduct : Product{
public SecondProduct (){
productName = "TwoProduct ";
}
}
//创建者,工厂方法创建是一个框架,让子类决定要如何实现具体的产品
public abstract class Creator{
public Product FactoryMethod(String productType){
Product product;
product = CreateProduct(productType);
return product;
}
//让子类去实现要生产什么产品
public abstract Product CreateProduct(String productType);
}
//第一个创建工厂
public class OneCreator : Creator{
public override Product CreateProduct(String productType){
switch(productType){
case "one":
return new OneProduct();
case "two":
return new TwoProduct();
}
return null;
}
}
//第二个创建工厂
public class FirstCreator : Creator{
public override Product CreateProduct(String productType){
switch(productType){
case "one":
return new FirstProduct();
case "two":
return new SecondProduct();
}
return null;
}
}
//客户端
public static void Main(){
//第一个工厂创建产品
Creator creator_01 = new OneCreator();
Product product_01 = creator_01 .FactoryMethod("one");
Console.WriteLine(product_01 .productName);
product_01 = creator_01 .FactoryMethod("two");
Console.WriteLine(product_01 .productName);
//第二个工厂创建产品
Creator creator_02 = new FristCreator();
Product product_02 = creator_02 .FactoryMethod("one");
Console.WriteLine(product_02 .productName);
product_02 = creator_02 .FactoryMethod("two");
Console.WriteLine(product_02 .productName);
Console.ReadLine();
}
工厂方法模式实现时,客户端需要决定实例化哪一个工厂开始先产品类,选择判断的问题还是存在的,也就是说工厂方法把简单工厂的内部逻辑判断转移到了客户端代码来进行,你想要加功能本来是改工厂类的,而现在是修改客户端。