工厂模式04
一、完成者信息:
姓名:韦庆
学号:07770104
二、模式信息
模式名称:工厂模式
模式概述:
当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,就可以使用工厂方法模式来设计系统。工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。
工厂方法模式的结构中包括四种角色。
● 抽象产品(Product):抽象类或接口,负责定义具体产品必须实现的方法。
● 具体产品(ConcreteProduct):具体产品是一个类,如果Product是一个抽象类,那么具体产品是Product的子类;如果Product是一个接口,那么具体产品是实现Product接口的类。
● 构造者(Creator):一个接口或抽象类。构造者负责定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例。
● 具体构造者(ConcreteCreator):如果构造者是抽象类,具体构造者是构造者的子类;如果构造者是接口,具体构造者是实现构造者的类。具体构造者重写工厂方法使该方法返回具体产品的实例。
定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使一个类的实例化延迟到其子类。
生活场景:
我们经常使用的手机类型多种多样,每种类型的手机制造商都可能不一样,但是这些制造商有一个共同点那就是目的就是生产手机。
终极目标: 不同厂家生产不同类型的手机。
- 1. 不假思索的思路:
针对每一种类型的手机都声明一个类,然后抽象出一个手机类,在抽象类中定义一个抽象方法用来生产手机。如下:
实现代码:
public abstract class phone
{
public abstract void produce();
}
public class Nokia : phone
{
public override void produce()
{
Console.WriteLine("生产nokia手机");
}
}
public class Motorola : phone
{
public override void produce()
{
Console.WriteLine("生产Motorola手机");
}
}
class Program
{
static void Main(string[] args)
{
phone p;
p = new Nokia();
p.produce();
p = new Motorola();
p.produce();
Console.ReadLine();
}
}
缺点:手机本身是一个整体,它并没有生产的方法,也即该子类已经和用户代码形成了耦合,这实际上是不成立的。
- 2. 归纳阶段
用工厂方法模式定义一个工厂方法,并为每种手机类型定义一个工厂,这样就达到子类和用户脱耦的目的。实现如下:
实现代码:
抽象产品
public abstract class Mobile
{
public string product;
public abstract void produce(string msg);
}
.具体产品
public class Motorola : Mobile
{
public Motorola()
{
product = "Motorola";
}
public override void produce(string msg)
{
Console.WriteLine("生产了一台" + msg + "手机");
}
}
public class Nokia : Mobile
{
public Nokia()
{
product = "Nokia";
}
public override void produce(string msg)
{
Console.WriteLine("生产了一台" + msg + "手机");
Console.WriteLine();
}
}
构造者
public abstract class MobileFactory
{
public MobileFactory()
{
Console.WriteLine( getMobile().product + "手机制造厂");
}
public abstract Mobile getMobile();//工厂方法
}
具体构造者
public abstract class MobileFactory
{
public MobileFactory()
{
Console.WriteLine( getMobile().product + "手机制造厂");
}
public abstract Mobile getMobile();//工厂方法
}
public class NokiaFactory : MobileFactory
{
public NokiaFactory()
{
//Console.WriteLine("生产了一台" + getMobile().product + "的手机");
}
public override Mobile getMobile()
{
return new Nokia();
}
}
class Program
{
static void Main(string[] args)
{
Mobile mobile;
MobileFactory mfactory = new NokiaFactory();
mobile = mfactory.getMobile();
mobile.produce("Nokia");
mfactory = new MotorolaFactory();
mobile = mfactory.getMobile();
mobile.produce("Motorola");
Console.ReadLine();
}
}
设计体会:通过工厂方法让用户代码和手机子类的代码解耦,同时用户不必知道他所使用的对象是怎样被创建的,只需要知道该对象有哪些方法即可。
3.验证阶段:
当前目标: 新增生产三星手机的需求。
结果为:新增一个三星的具体产品及生产三星手机的工厂
public class sangxing : Mobile
{
public sangxing()
{
product = "sanxing";
}
public override void produce(string msg)
{
Console.WriteLine("生产了一台" + msg + "手机");
}
}
public class sanxingFactory : MobileFactory
{
public sanxingFactory()
{
}
public override Mobile getMobile()
{
return new sangxing();
}
}
4、抽象阶段:
思路描述:将商品抽象出一个抽象产品,接着定义每个具体产品;为每个产品声明一个工厂类,抽象出构造者。
类结构图: