目录
工厂方法模式,是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
如果你老板,开发了一款出售灯饰的系统,最初设计的是只有一种灯,蓝色的灯,然后你把大部分的代码都写在了蓝灯类中,一段时间后,你的货物销量非常好,而且销售到了海外,海外客户希望你能出售红灯的产品,这对于公司来说,非常有利。但是此时的代码已经全部写在蓝灯类里面了,你是在蓝灯类里面,增加红灯的逻辑吗?这样修改量太大了,如果以后增加绿灯怎么办呢?
工厂方法模式建议使用特殊的工厂方法代替对于对象构造函数的直接调用(即使用 new运算符)。 不用担心,对象仍将通过new运算符创建,只是该运算符改在工厂方法中调用罢了。 工厂方法返回的对象通常被称作 “产品”。
1.当你在编写代码的过程中,如果无法预知对象确切类别及其依赖关系时,可使用工厂方法。
2.如果你希望用户能扩展你软件库或框架的内部组件,可使用工厂方法。
3.如果你希望复用现有对象来节省系统资源, 而不是每次都重新创建对象,可使用工厂方法。
优点 | 缺点 |
你可以避免创建者和具体产品之间的紧密耦合 | 应用工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。 最好的情况是将该模式引入创建者类的现有层次结构中 |
单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护 | |
开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型 |
其中简单工厂模式属于工厂模式,工厂模式保持了简单工厂模式的优点,而且克服了它的缺点。
图示表达
看起来很麻烦,其实记忆起来非常的简单。首先分2部分,抽象工厂和具体工厂,然后有几个抽象产品就有几个具体产品,他们是一 一对应的关系。
1.建立一个控制台程序,代码文件总览。可见上面说的缺点,就体现出来了,写了很多的子类,如果分不清结构,将是灾难性的代码。
2.抽象产品,Light类
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace ConsoleApp3
- {
- public abstract class Light //建立抽象产品, abstract,不能实例化
- {
- public abstract void TurnOn(); //抽象产品有打开的方法,abstract,不能实现
- public abstract void TurnOff(); //抽象产品有关闭的方法,abstract,不能实现
- }
- }
3.具体产品,BulbLight类
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace ConsoleApp3
- {
- public class BulbLight : Light //灯泡的光,建立具体的产品,继承灯泡
- {
- public override void TurnOff()//实现灯泡的功能,override重写继承的方法
- {
- Console.WriteLine("关闭");
- }
-
- public override void TurnOn() //实现灯泡的功能,override重写继承的方法
- {
- Console.WriteLine("打开");
- }
- }
- }
4.具体产品,TubeLight类
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace ConsoleApp3
- {
- public class TubeLight : Light //灯的灯管,建立具体的产品,继承灯泡
- {
- public override void TurnOff() //实现灯泡的功能,override重写继承的方法
- {
- Console.WriteLine("关闭");
- }
-
- public override void TurnOn() //实现灯泡的功能,override重写继承的方法
- {
- Console.WriteLine("打开");
- }
- }
- }
5.抽象工厂,Creator类
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace ConsoleApp3
- {
- public abstract class Creator //建立抽象工厂, abstract,不能实例化
- {
- public abstract Light factory(); //建立Light产品抽象类,默认方法factory
- }
- }
6.具体工厂,BulbCreator类
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace ConsoleApp3
- {
- public class BulbCreator : Creator //制造灯光的厂,具体工厂,继承工厂
- {
- public override Light factory() //重写工厂的方法
- {
- return new BulbLight(); //返回制造灯泡的光
- }
- }
- }
7.具体工厂,TubeCreator类
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace ConsoleApp3
- {
- public class TubeCreator : Creator //制造灯管的厂,具体工厂,继承工厂
- {
- public override Light factory() //重写工厂的方法
- {
- return new TubeLight(); //返回制造灯管
- }
- }
- }
8.使用
- using System;
- using System.Threading;
- using System.Threading.Tasks;
-
- namespace ConsoleApp3
- {
- class Program
- {
- static void Main(string[] args)
- {
- Creator c1 = new BulbCreator();
- Creator c2 = new TubeCreator();
- Light l1 = c1.factory();
- Light l2 = c2.factory();
- l1.TurnOn();
- l1.TurnOff();
- new BulbCreator().factory().TurnOn();
- Console.WriteLine("-----------------");
- l2.TurnOn();
- l2.TurnOff();
- new TubeCreator().factory().TurnOn();
- Console.WriteLine("结束");
- }
- }
- }
9.效果