标签:
工厂模式
一:引子
话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)看来这人比较爱国,没有日本车),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上Audi后他说"开奥迪车!"。你一定说:这人有病!直接说开车不就行了?! 而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是,这种有病的现象在OO语言中可以避免了。下面以Java语言为基础来引入我们本文的主题:工厂模式!!
二:作用
作用:优化项目结构,实例化类(或者接口)。
好处:将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
三:分类
1:抽象工厂(Simple Factory)
2:工厂模式(Factory Method)
3:抽象工厂模式(Abstract Factory)
很多地方都做做出了三个工厂模式的应用环境,及使用区别分析,个人感觉大没有这个必要。毕竟三者都属于工厂模式,且在使用中框架服务于需求,需求的改变可能会使三者间相互转换。
1):抽象工厂
3.1.1):结构
工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
抽象产品角色(Product):简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
具体产品角色(Concrete Product):简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
3.1.2):UML
3.1.3):代码示例
接口类:
public interface ICreate { void Create(); }
实体类:
public class Animal:ICreate { public void Create() { Console.WriteLine("创建动物"); } }
public class People:ICreate { public void Create() { Console.WriteLine("创建人类"); } }
工厂类:
public class CreateFactory { public static ICreate GeneratorCreate(string createName) { switch (createName) { case "People": return new People(); case "Animal": return new Animal(); default : throw new NotImplementedException(); } } }
客户端:
public class Factory { public void dd() { var dd= CreateFactory.GeneratorCreate("People"); } }
3.1.4):总结
优点:基本实现了根据参数生成实体类的作用,降低了耦合性。
缺点:所有商品来源于一个工厂,就限制了产品的多样性。例如:生成宝马的厂子,我现在想要俩奔驰,该场景就不能使用现有的简单工厂模式实现功能了。
改进:添加新的产品项的时候创建新的工厂。
2):抽象工厂
3.2.1):结构
抽象工厂角色(Creator)
具体工厂角色(Concrete Creactor)
抽象产品角色(Product)
具体产品角色(Concrete Product)
3.2.2):UML
3.2.3):代码示例
抽象工厂:
public interface CreateFactory { ICreate CreateObject(); }
工厂角色
public class PeopleFactory : CreateFactory { public ICreate CreateObject() { return new People(); } }
抽象产品
public interface ICreate { void Create(); }
产品角色
public class People:ICreate { public void Create() { } }
3.2.4):总结
......(明天再写)
标签:
原文地址:http://www.cnblogs.com/xininuo/p/4842866.html