《设计模式》一书
UML类图------StarUML
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class LegencyFunction : MonoBehaviour {
private void Start()
{
float? result=Count(10,21,"*");
Debug.Log(result);
//新模式
BinaryOperation operation = OperationFactory.CreateOperation(1,2,"+");
operation.SetNumber(2,3);
float newresult=operation.GetResult();
Debug.Log(newresult);
}
public float? Count(float num01,float num02,string sign) {
switch (sign) {
case "+":
return num01 + num02;
case "-":
return num01 - num02;
case "*":
return num01 * num02;
case "/":
return num01 / num02;
default:
return null;
}
}/// <summary>
/// /工厂模式
/// </summary>
public abstract class BinaryOperation {
protected float number01;
protected float number02;public BinaryOperation() { }
public void SetNumber(float number01,float number02) {
this.number01 = number01;
this.number02 = number02;
}public BinaryOperation(float number01, float number02)
{
this.number01 = number01;
this.number02 = number02;
}
public abstract float GetResult();
}
public class PlusOperation : BinaryOperation
{
public PlusOperation(float number01, float number02) : base(number01, number02)
{
}public override float GetResult()
{
return number01 + number02;
}
}public class SubtractionOperation : BinaryOperation
{
public SubtractionOperation(float number01, float number02) : base(number01, number02)
{
}public override float GetResult()
{
return number01 - number02;
}
}public class MultiplicationOperation : BinaryOperation
{
public MultiplicationOperation(float number01, float number02) : base(number01, number02)
{
}public override float GetResult()
{
return number01*number02;
}
}public class OperationFactory {
public static BinaryOperation CreateOperation(float number01, float number02, string sign) {
switch (sign)
{
case "+":
return new PlusOperation(number01,number02);
case "-":
return new SubtractionOperation(number01, number02);
case "*":
return new MultiplicationOperation(number01,number02);
default:
return null;
}
}
}
}
拆分、隔离
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UnityAssetsFactory : MonoBehaviour {
public static UnityAsset CreateUnityAsset(string assetType) {
switch (assetType) {
case "GameObject":
return new PrefabAsset("");
case "Sprite":
return new SpriteAsset("");
default:
return null;
}
}
}public abstract class UnityAsset {
public string path;
public UnityAsset(string path) {
this.path=path;
}
protected object asset;
public void Load() { asset = Resources.Load(path); }
public abstract void Instantiate();
public abstract void Show();
}public class PrefabAsset : UnityAsset
{public PrefabAsset(string path) : base(path)
{
}public override void Instantiate()
{
GameObject go = GameObject.Instantiate(asset as GameObject);
}public override void Show()
{
}
}public class SpriteAsset : UnityAsset
{public SpriteAsset(string path) : base(path)
{
}public override void Instantiate()
{
GameObject go = new GameObject("Sprite");
SpriteRenderer spriteRenderer=go.AddComponent<SpriteRenderer>();
Sprite sprite = Sprite.Create(asset as Texture2D,new Rect(0,0,100,100),Vector2.zero);
sprite.name = "sprite";
spriteRenderer.sprite = sprite;
}public override void Show()
{
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UnityFactoryConsole : MonoBehaviour {
private void Start()
{
//第一步,工厂生产对象
//UnityAsset unityAsset =UnityAssetsFactory.CreateUnityAsset("GameObject","Cube");
UnityAsset unityAsset = UnityAssetsFactory.CreateUnityAsset("Sprite");
unityAsset.path = "Pig";
//第二步,对象加载资源
unityAsset.Load();
//第三步,生产该资源
unityAsset.Instantiate();
}}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UnitySingletonFactory : MonoBehaviour {
public static UnitySingletonFactory instance;private void Awake()
{
instance = this;
DontDestroyOnLoad(gameObject);//单例永久存在
}public T GetAsset<T>(string assetPath) where T:Object {
return Resources.Load<T>(assetPath);
}
public T[] GetAssets<T>(string assetsPath) where T:Object {
return Resources.LoadAll<T>(assetsPath);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UnityFactoryConsole : MonoBehaviour {
private void Start()
{
//第一步,工厂生产对象
//UnityAsset unityAsset =UnityAssetsFactory.CreateUnityAsset("GameObject","Cube");
UnityAsset unityAsset = UnityAssetsFactory.CreateUnityAsset("Sprite");
unityAsset.path = "Pig";
//第二步,对象加载资源
unityAsset.Load();
//第三步,生产该资源
unityAsset.Instantiate();//单例工厂--->直接获取资源
GameObject cubePrefab=UnitySingletonFactory.instance.GetAsset<GameObject>("Cube");
Instantiate(cubePrefab);
}}