《Head First 设计模式》学习心得
工厂模式
- 简单工厂模式:把实例化对象的代码集中到一个具体的工厂类中。
- 工厂方法:定义一个创建对象的抽象方法,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
- 抽象工厂:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。抽象工厂类中集中了一系列的抽象方法。
使用场合:
如果要实例化的对象变化比较小,使用简单工厂。简单工厂属于最轻量级的工厂模式。如果需要在子类中实例化单一对象,则用工厂方法。如果要实例化一系列的相似对象,则用抽象工厂。
简单工厂
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 简单工厂
{
class Program
{
static void Main(string[] args)
{
}
}
// 比萨店
public class PizzaStore
{
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory)
{
this.factory = factory;
}
public void OrderPizza(string type)
{
Pizza pizza;
pizza = factory.CreatePizza(type);
pizza.Prepare();
pizza.Bake();
pizza.Cut();
pizza.Box();
}
}
// 简单比萨工厂类,把所有实例化的部分放到工厂中
public class SimplePizzaFactory
{
public Pizza CreatePizza(string type)
{
Pizza pizza = null;
if (type.Equals("cheese"))
{
pizza = new CheesePizza();
}
else if (type.Equals("pepperoni"))
{
pizza = new PepperoniPizza();
}
else if (type.Equals("clam"))
{
pizza = new ClamPizza();
}
else if (type.Equals("veggie"))
{
pizza = new VeggiePizza();
}
return pizza;
}
}
// 比萨
abstract public class Pizza
{
// 准备
public void Prepare()
{
}
// 烘烤
public void Bake()
{
}
// 切割
public void Cut()
{
}
// 打包
public void Box()
{
}
}
public class CheesePizza:Pizza
{
}
public class VeggiePizza : Pizza
{
}
public class ClamPizza : Pizza
{
}
public class PepperoniPizza : Pizza
{
}
}
工厂方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 工厂方法
{
class Program
{
static void Main(string[] args)
{
}
}
// 抽象比萨店类
public abstract class PizzaStore
{
protected abstract Pizza CreatePizza(string type); // 工厂方法,在具体比萨店中实现
public Pizza OrderPizza(string type)
{
Pizza pizza;
pizza = CreatePizza(type);
pizza.Prepare();
pizza.Bake();
pizza.Cut();
pizza.Box();
return pizza;
}
}
abstract public class Pizza
{
// 准备
public void Prepare()
{
}
// 烘烤
public void Bake()
{
}
// 切割
public void Cut()
{
}
// 打包
public void Box()
{
}
}
}
抽象工厂
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 抽象工厂
{
class Program
{
static void Main(string[] args)
{
}
}
// 具体工厂类
public class NyPizzaIngredientFactory : PizzaIngredientFactoty
{
public Dough CreateDough()
{
throw new NotImplementedException();
}
public Sauce CreateSauce()
{
throw new NotImplementedException();
}
}
// 抽象工厂类,集中实例化对象
public interface PizzaIngredientFactoty
{
Dough CreateDough();
Sauce CreateSauce();
}
public interface Dough
{
}
public interface Sauce
{
}
}