工厂模式の第一次

工厂模式

定义

  • 工厂模式主要作用是为创建对象提供接口,将创建对象的过程分离出来,实现创建者与调用者的隔离,提高程序的灵活性。
  • 主要目标:
    • 分离实例化对象的过程,用工厂方法代替new操作
    • 选择实现类、创建对象、对象的统一管理和控制等功能分离,使调用者跟实现类解耦
  • 主要分类:
    • 简单工厂模式
    • 工厂方法模式
    • 抽象工厂模式

简单工厂模式

  • 又称为静态工厂方法
  • 主要组成结构:
    • 抽象产品: 定义产品的基本属性
    • 具体产品: 定义具体产品的属性
    • 工厂类: 创建具体产品

示例

抽象产品

1
2
3
4
public interface IHero
{
void Attack();
}

具体产品

1
2
3
4
5
6
7
public class IronMan : IHero
{
public void Attack()
{
Console.WriteLine($"Iron Man Attack");
}
}
1
2
3
4
5
6
7
public class Thor : IHero   
{
public void Attack()
{
Console.WriteLine($"Thor Attack");
}
}

工厂类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class SimpleFactory
{
public IHero CreateHeroFactory(string heroType)
{
switch (heroType)
{
case "IronMan":
return new IronMan();
case "Thor":
return new Thor();
default:
return null;
}
}
}

调用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main(string[] args)
{
UseSimpleFactory();
}

public static void UseSimpleFactory()
{
HeroFactory heroFactory = new HeroFactory();
IHero ironMan = heroFactory.CreateHeroFactory("IronMan");
IHero thor = heroFactory.CreateHeroFactory("Thor");
ironMan.Attack();
thor.Attack();
}

总结

  • 简单工厂模式初步实现了对象实例化方法的剥离,但是,简单工厂对于拓展开发不是很友好,以后若是要拓展新的产品则需要修改工厂类的原始代码,这显然是违反了开闭原则(对拓展开放,对修改关闭)的

工厂方法模式

  • 由于简单工厂模式违反了开闭原则,在大型的项目长期开发中不适合使用,为了不违反开闭原则,在简单工厂代码的基础上稍作修改即可
  • 主要组成结构:
    • 抽象产品: 定义产品的基本属性
    • 具体产品: 定义具体产品的属性
    • 抽象工厂: 定义工厂的基本属性
    • 具体工厂: 创建具体产品

示例

抽象产品

1
2
3
4
public interface IHero
{
void Attack();
}

具体产品

1
2
3
4
5
6
7
public class IronMan : IHero
{
public void Attack()
{
Console.WriteLine($"Iron Man Attack");
}
}
1
2
3
4
5
6
7
public class Thor : IHero   
{
public void Attack()
{
Console.WriteLine($"Thor Attack");
}
}

抽象工厂

1
2
3
4
public interface IHero
{
void Attack();
}

具体工厂

1
2
3
4
5
6
7
public class ThorFactory : IHeroFactory
{
public IHero CreateHero()
{
return new Thor();
}
}
1
2
3
4
5
6
7
public class IronManFactory : IHeroFactory
{
public IHero CreateHero()
{
return new IronMan();
}
}

调用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void Main(string[] args)
{
UseFactoryMethod();
}

public static void UseFactoryMethod()
{
IHeroFactory heroFactory = new IronManFactory();
var ironMan = heroFactory.CreateHero();
ironMan.Attack();

IHeroFactory thorFactory = new ThorFactory();
var thor = thorFactory.CreateHero();
thor.Attack();
}

总结

  • 工厂方法模式有效的解决了项目拓展的问题,拓展时不需要修改原来的代码,但是工厂中一般可以生产很多种产品,所以在工厂方法模式上再进一步优化,就可以得到抽象工厂模式

抽象工厂模式

  • 抽象工厂其实就是在工厂方法模式的基础上,在具体工厂中可以创建多种具体产品,更加贴近实际应用。具体结构与工厂方法模式类似。

拓展:单例模式

  • 工厂模式拓展出来的模式中应用最广泛的就是单例模式
  • 由于将对象的创建通过工厂类控制,所以可以有效的控制实例化的数量,从而实现单例模式。