创建型模式—工厂三兄弟
提示:个人学习总结,如有错误,敬请指正
提示:以下是本篇文章正文内容,下面案例可供参考
一、简单工厂模式
1.简单工厂模式是什么?
简单工厂的核心是:创建一个专门创建实例的类,一般来说创建的实例都拥有相同的父类或接口。
要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
2.UML图
//TODO
3.实现方式
抽象产品:抽象类或者接口
public abstract class CubeBase
{
public abstract void GenerateCube();
}
具体产品:继承抽象产品,自定义实现
using UnityEngine;
public class BigCube : CubeBase
{
public override void GenerateCube()
{
var gameobj = GameObject.CreatePrimitive(PrimitiveType.Cube);
gameobj.transform.localScale *= 2;
}
}
using UnityEngine;
public class SmallCube : CubeBase
{
public override void GenerateCube()
{
var gameobj = GameObject.CreatePrimitive(PrimitiveType.Cube);
gameobj.transform.localScale *= 0.5f;
}
}
工厂类:通过工厂类直接创建实例
using UnityEngine;
public class CubeFactory : MonoBehaviour
{
public static CubeBase CubeGenerate(CubeCategory type)
{
CubeBase cube = null;
switch (type)
{
case CubeCategory.big:
cube = new BigCube();
break;
case CubeCategory.small:
cube = new SmallCube();
break;
default:
cube = null;
break;
}
return cube;
}
public enum CubeCategory
{
big,
small,
}
}
客户端
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SimpleFactoryEntary : MonoBehaviour
{
CubeBase cubeBase;
private void Start()
{
cubeBase = CubeFactory.CubeGenerate(CubeFactory.CubeCategory.big);
cubeBase.GenerateCube();
}
}
二、工厂(方法)模式
1.工厂(方法)模式是什么?
工厂(方法)模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例欧化延迟到其子类。
与简单工厂相比:不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。
简而言之,就是简单工厂的升级版,工厂方法实现时,客户端需要决定实例化哪一个工厂来实现生成产品,选择判断的问题还是存在的,也就是说工厂方法把简单工厂的内部逻辑判断转移到了客户端,你要加功能,本来是改工厂类,现在是修改客户端
2.UML图
//TODO
3.实现方式
工厂接口:
interface IFactory
{
CubeBase CreateCube();
}
具象工厂:
public class SpheresFactory : IFactory
{
public ShapeBase CreateFactory()
{
return new Spheres();
}
}
public class CubesFactory : IFactory
{
public ShapeBase CreateFactory()
{
return new Cubes();
}
}
抽象产品
public abstract class ShapeBase
{
public abstract void GenerateShape();
}
具体产品
using UnityEngine;
public class Cubes : ShapeBase
{
public override void GenerateShape()
{
GameObject.CreatePrimitive(PrimitiveType.Cube);
}
}
using UnityEngine;
public class Spheres : ShapeBase
{
public override void GenerateShape()
{
GameObject.CreatePrimitive(PrimitiveType.Sphere);
}
}
客户端:
using UnityEngine;
public class FactoryEntary : MonoBehaviour
{
void Start()
{
IFactory factory = new CubesFactory();
var cube = factory.CreateFactory();
cube.GenerateShape();
}
}
三.抽象工厂模式
1.抽象工厂模式是什么?
抽象工厂模式(AbstrucFactory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。它只是工厂模式的一个扩展,若其只有一个产品体系则变成工厂模式
2.UML图
//TODO
3.实现方式
产品接口:抽象产品
interface IACube
{
void Generate();
}
interface IASphere
{
void Generate();
}
具体产品
public class ABigCube : IACube
{
public void Generate()
{
var gameobj = GameObject.CreatePrimitive(PrimitiveType.Cube);
gameobj.transform.localScale *= 2f;
}
}
using UnityEngine;
public class ASmallCube : IACube
{
public void Generate()
{
var gameobj = GameObject.CreatePrimitive(PrimitiveType.Cube);
gameobj.transform.localScale *= 0.5f;
}
}
using UnityEngine;
public class ASmallSphere : IASphere
{
public void Generate()
{
var gameobj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
gameobj.transform.localScale *= 0.5f;
}
}
using UnityEngine;
public class ABigSphere : IASphere
{
public void Generate()
{
var gameobj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
gameobj.transform.localScale *= 2f;
}
}
抽象工厂
interface AbstructFactory
{
IACube CreateCube();
IASphere CreateSphere();
}
具体工厂
class AFactoryOne : AbstructFactory
{
public IACube CreateCube()
{
return new ABigCube();
}
public IASphere CreateSphere()
{
return new ABigSphere();
}
}
class AFactoryTwo : AbstructFactory
{
public IACube CreateCube()
{
return new ASmallCube();
}
public IASphere CreateSphere()
{
return new ASmallSphere();
}
}
客户端
using UnityEngine;
public class AbstructFactoryEntary : MonoBehaviour
{
private void Start()
{
AbstructFactory factory = new AFactoryOne();
var a = factory.CreateCube();
var b = factory.CreateSphere();
a.Generate();
b.Generate();
}
}
四、三者的异同
//TODO
五、三者的优缺点
//TODO
六、三者的适用场景
//TODO
|