1.概念
《设计模式》一书中对于工厂方法模式是这样定义的:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
2.简单工厂模式
先简单说下简单工厂模式,简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它又称为静态工厂方法模式。缺点是违反了开闭原则。
Java代码
//生产产品的工厂类
public class ProductFactory{
public static Product generateProduct(int which){
//这个方法是static的
if (which==1)
return new ProductA();
else if (which==2)
return new ProductB();
}
}
//抽象产品
public interface Product { ..... }
//具体产品A
public ProductA implement Product {
ProductA () {}
}
//具体产品B
public ProductB implement Product {
ProductB () {}
}
//调用工厂方法
public Client {
public method1() {
ProductFactory.generateProduct(1);
}
}
Java代码
interface a{}
class b implements a{};
class c implements a{};
工厂类
public class factory{
public static a createa(string name){
class cls=class.forname(name);
object obj=cls.getinstance();
return (a)obj;
}
}
//创建实例时
a b=factory.createa("b");
a c=factory.createa("c");
3.工厂方法
简单工厂模式,如果有新的产品生产,那么就要修改工程类一适应新的需求。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
Java代码
//产品 Plant接口
public interface Plant { }
//具体产品PlantA,PlantB
public class PlantA implements Plant {
public PlantA () {
System.out.println("create PlantA !");
}
public void doSomething() {
System.out.println(" PlantA do something ...");
}
}
public class PlantB implements Plant {
public PlantB () {
System.out.println("create PlantB !");
}
public void doSomething() {
System.out.println(" PlantB do something ...");
}
}
// 抽象工厂方法
public interface AbstractFactory {
public Plant createPlant();
}
//具体工厂方法
public class FactoryA implements AbstractFactory {
public Plant createPlant() {
return new PlantA();
}
}
public class FactoryB implements AbstractFactory {
public Plant createPlant() {
return new PlantB();
}
}
//调用工厂方法
public Client {
public method1() {
AbstractFactory instanceA = new FactoryA();
instanceA.createPlant();
AbstractFactory instanceB = new FactoryB();
instanceB.createPlant();
}
}
why? 为什么要使用工厂方法呢?我们需要产品的时候,完全可以用new生产产品啊?因为我们要针对接口编程,使用了工厂方法,对于客户client来说,就可以简单的获得产品而不需要清楚如何生产产品,那是工厂类负责的。以上代码说明了工厂结合多态的用法。可以看出可以通过工厂方法返回的对象类型是一个抽象的类型AbstractFactory,而实际的对象是具体的一个子类FactoryA。这样调用者不必关心对象创建的细节,而且增加了程序的可扩展性。如上面的例子里如果在加入一个新的子类FactoryC时:class FactoryC implements AbstractFactory{};,调用时只需要:AbstractFactory c=new FactoryC();。如果把子类的名称放在配置文件里就可以轻松的实现子类的“可配置”了,这样就符合面向对象设计原则中的"开-闭"原则。
4.简单工厂和工厂方法的区别
(1)、工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
(2)、当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了"开放-封闭"原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
分享到:
相关推荐
设计模式-工厂方法模式视频 设计模式-工厂方法模式视频 设计模式-工厂方法模式视频
c++设计模式-创建型模式-工厂方法模式-最简单的源码-qt工程
iOS设计模式-工厂方法 理论在这个网页:http://blog.csdn.net/z251257144/article/details/7479183
设计模式-工厂方法 讲解及其源码
设计一个程序来读取多种不同存储格式的图片,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF格式图片读取器(GifReader)用于读取...请使用工厂方法模式实现该程序的设计,并使用UML画出该模式的类图。
工厂方法模式,主要是利用反射机制获取配置文件的信息,用户可以在不知道如何生产对象的情况下获取对象。包括源代码和文档(文档在本博客的文档说明中)。
Java设计模式,工厂方法的Demo,具体的思想有很多讲得很好的老师,我是看厉风行老师的视频学的,讲得不错,简单易懂
该文件是,设计模式中最常见的工厂模式的实现代码,其中有两个实例!
NET设计模式--工厂方法例子源码
设计模式--工厂模式java例子
创建型设计模式---工厂设计模式实现
设计模式-工厂模式 学习练习的代码 1.简单工厂模式 2.方法工厂模式 3.抽象工厂模式 4.模拟Spring Bean工厂练习
java设计模式-创建者模式-简单工厂模式。详细的讲解了什么是工厂方法模式及应用场景和应用场景的代码事例。及各工厂模式的区别。
JAVA-设计模式-创建型模式-工厂模式
java设计模式--工厂模式 HeadFirst 书中的源代码
设计模式 -工厂模式.pdf
java常用设计模式-工厂模式
c++设计模式-创建型-抽象工厂方法-最简单源码-qt工程
设计模式--抽象工厂模式实现多数据库连接 设计模式,.net设计模式,抽象工厂
C#设计模式-工厂模式系列