工厂减少了需要从对象创建代码创建对象的代码之间的耦合。不是通过调用类构造函数来显式地创建对象,而是通过调用一些代表调用者创建对象的函数。下面是一个简单的Java示例:
interface Car { } public class CarFactory{ static public Car create(String s) { switch (s) { default: case "us": case "american": return new Chrysler(); case "de": case "german": return new Mercedes(); case "jp": case "japanese": return new Mazda(); } } } class Chrysler implements Car { public String toString() { return "Chrysler"; } } class Mazda implements Car { public String toString() { return "Mazda"; } } class Mercedes implements Car { public String toString() { return "Mercedes"; } } public class CarEx { public static void main(String args[]) { Car car = CarFactory.create("us"); System.out.println(car); } }
在此示例中,用户仅给出了有关其需求的提示,而工厂可以自由地构造适当的东西。这是一个依赖倒置:Car概念的实现者可以自由返回Car用户请求的适当的具体对象,而后者又不知道所构建具体对象的详细信息。
这是工厂工作方式的一个简单示例,当然在此示例中,总是可以实例化具体类。但是可以通过将具体的类隐藏在包中来防止这种情况,从而迫使用户使用工厂。
.Net小提琴为上述示例。
活字印刷 面向对象 话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,曹操大悦,于是大宴众文武,在酒席间,曹操诗兴大发,不觉吟道:喝酒唱歌,人生真爽。众文武齐呼:“丞相好诗!于是一臣子速命印刷工匠刻板印刷,以便流传天下。” 样张出来给曹操一看,曹操感觉不妥,说到:“喝与唱,此话过俗,应该为‘对酒当歌’较好!”,于是此臣就命工匠重新来过。工匠眼看连
//抽象类 enum SpliterType { BinaryType = 0, TxtYype = 1 }; class ISplitter { public: virtual void split() = 0; virtual ~ISplitter() {} }; //具体类 class BinarySplitter : public ISplitter { public: voi
一、简单工厂模式简介 1.定义 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 2.使用动机 考虑一个简单的软件应用场景:一个软件系统可以提供多个外观不同的
3 完整解决方案 为了将Chart类的职责分离,同时将Chart对象的创建和使用分离,Sunny软件公司开发人员决定使用简单工厂模式对图表库进行重构,重构后的结构如图2所示: 图2 图表库结构图 在图2中,Chart接口充当抽象产品类,其子类HistogramChart、PieChart和LineChart充当具体产品类,ChartFactory充当工厂类。完整代码如下
2 简单工厂模式概述 简单工厂模式并不属于GoF 23个经典设计模式,但通常将它作为学习其他工厂模式的基础,它的设计思想很简单,其基本流程如下: 首先将需要创建的各种不同对象(例如各种不同的Chart对象)的相关代码封装到不同的类中,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用
4 方案的改进 Sunny软件公司开发人员发现在创建具体Chart对象时,每更换一个Chart对象都需要修改客户端代码中静态工厂方法的参数,客户端代码将要重新编译,这对于客户端而言,违反了“开闭原则”,有没有一种方法能够在不修改客户端代码的前提下更换具体产品对象呢?答案是肯定的,下面将介绍一种常用的实现方式。 我们可以将静态工厂方法的参数存储在XML或propertie