抽象工厂
优点 1 比工厂方法的,一个工厂生产一个产品,优化为一个工厂生成多个产品
优点 2 简单工厂方法一个工厂生产而且需要指定输入的产品名信息。抽象工厂封装了产品和具体工厂绑定,对产品名字隐藏封装,并且一个工厂可以生产组合产品,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Reflection;
namespace FactoryMothod
{
//抽象产品
interface product
{
void MethodSame();
void MethodDisplay();
}
//具体产品A
class ConcreatemethodA: product
{
public void MethodSame()
{
Console.WriteLine("MethodSameA");
}
public void MethodDisplay()
{
Console.WriteLine("MethodDisplayA");
}
}
//具体产品B
class ConcreatemethodB : product
{
public void MethodSame()
{
Console.WriteLine("MethodSameB");
}
public void MethodDisplay()
{
Console.WriteLine("MethodDisplayB");
}
}
//抽象方法二
interface ProductTwo
{
void MethodDisplay();
}
//具体产品二A
class ConcreatemethodAA : ProductTwo
{
public void MethodDisplay()
{
Console.WriteLine("ConcreatemethodAA");
}
}
//具体产品二B
class ConcreatemethodBB : ProductTwo
{
public void MethodDisplay()
{
Console.WriteLine("ConcreatemethodBB");
}
}
//抽象工厂
interface Factory
{
product GetProduct();
ProductTwo GetProductTwo();
}
//具体工厂A
class ConcreateFactoryA: Factory
{
public product GetProduct()
{
product product = null;
product = new ConcreatemethodA();
return product;
}
public ProductTwo GetProductTwo()
{
ProductTwo product = null;
product = new ConcreatemethodAA();
return product;
}
}
//具体工厂B
class ConcreateFactoryB : Factory
{
public product GetProduct()
{
product product = null;
product = new ConcreatemethodB();
return product;
}
public ProductTwo GetProductTwo()
{
ProductTwo product = null;
product = new ConcreatemethodBB();
return product;
}
}
class Program
{
static void Main(string[] args)
{
Factory factory;
product product;
ProductTwo productTwo;
//读取配置文件
string FactoryName = ConfigurationManager.AppSettings["FactoryName"];
//反射生成对象
object obj = Assembly.Load("FactoryMothod").CreateInstance(FactoryName);
factory = obj as Factory;
product = factory.GetProduct();
product.MethodSame();
product.MethodDisplay();
productTwo = factory.GetProductTwo();
productTwo.MethodDisplay();
Console.ReadKey();
}
}
}