应用最广泛的模式-工厂方法模式

1、工厂方法模式的定义:

定义一个用于创建对象的接口,让子类决定实例化哪个类。

/**抽象产品类**/

public  abstract class Product{

//产品类的抽象方法

//由具体的产品类去实现

public abstract void method();

}

/**具体产品类A**/

public class ConcreteProductA extends Product{

@Override

public void method(){

System.out.println(“我是具体的产品A”);

}

}

/**具体产品类B**/

public class ConcreteProductB extends Product{

@Override

public void method(){

System.out.println(“我是具体的产品B”);

}

}

/**抽象工厂类**/

public abstract class Factory{

//抽象工厂方法

//具体生产什么由子类去实现

//@return 具体的产品对象

public abstract Product createProduct();

}

/**具体工厂类**/

public class ConcreteFactory extends Factory{

@Override

public Product createProduct(){

return new ConcreteProductA();

}

}

/**客户类**/

public class Client{

public static void main(String[] args){

Factory factory = new ConcreteFactory();

Product p = factory.createProduct();

p.method();

}

}

2、通过反射的方式更简洁地来生产具体产品对象:

/**抽象工厂类**/

public abstract class Factory{

//抽象工厂方法

//具体生产什么由子类去实现

//@param clz 产品对象类类型

//@return 具体的产品对象

public abstract <T extends Product> T createProduct(Class<T> clz);

}

/**具体工厂类**/

public class ConcreteFactory extends Factory{

@Override

public <T extends Product> T createProduct(Class<T> clz){

Product p = null;

try{

p = (Product) Class.forName(clz.getName()).newInstance();

}catch(Exception e){

e.printStackTrace();

}

return (T) p;

}

}

/**客户类**/

public class Client{

public static void main(String[] args){

Factory factory = new ConcreteFactory();

Product p = factory.createProduct(ConcreteProductB.class);

p.method();

}

}

时间: 2024-12-21 01:55:26

应用最广泛的模式-工厂方法模式的相关文章

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

简单工厂模式\工厂方法模式

工厂模式 一.本节目标 我们本节课程主要介绍[工厂模式]的相关知识,将会涉及以下内容: 什么是工厂模式 工厂模式类图 工厂模式代码 工厂模式应用 PS:学习 Java 设计模式之前最好有一定的 Java 语言基础.由于讲这种东西其实比较枯燥,为了让大家学习起来轻松愉快一点,我会尽量使用一些生动.形象和幽默的例子. 二.什么是工厂模式 工厂模式(Factory Pattern)的意义就跟它的名字一样,在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象.工厂模式根据不同的参数来实现不同的分配

大话设计模式之简单工厂模式&amp;工厂方法模式&amp;抽象工厂模式

创造类模式分为三种:简单工厂模式,工厂模式和抽象工厂模式. 定义: 简单工厂模式:用一个单独的类来做创造实例的过程. 工厂模式:一个用于创建对象的接口,让子类决定实例化哪一个类,讲一个类的实例化 延迟到其子类. 抽象工厂模式:为创建一组相关或相互依赖的对象的类,而不指定具体类. 结构图: 这是简单工厂的结构图,从图中就很好理解. 简单工厂的优点: 根据用户需要,new出需要的对象. 但是简单工厂弊端: 当新加入一个功能是,就要修改工厂.这个时候,就需要工厂模式了. 从图中我们可以看出: 工厂模式

Java的23中设计模式--工厂方法模式(Factory Method)

1.普通工厂模式 工厂类 /** * @Title Factory.java * @Package factory.factory1 * @date 2015-1-22 上午10:16:02 * @version V1.0 */ package factory.factory1; /** * @ClassName Factory * @date 2015-1-22 上午10:16:02 */ public class Factory { public Sender procedure(Strin

工厂模式——工厂方法模式

工厂方法模式,咋一看在这个计算器程序里好像反而使程序变得更加“复制”,确实代码量好像是增加了,到底有什么好处呢?我想多领会领会,必然有它存在的理由. 我们先来看看“简单工厂模式”和“工厂方法模式”的类继承关系.上篇提到的“简单工厂模式”的类继承关系如下图所示: “工厂方法模式”的类继承关系如下图所示: 发现四个运算类分别有了各自的工厂类,这是为什么呢?我们先来实现代码. 运算符抽象类以及四个它的实现类不做任何变动,参照上篇. 由于多了四个工厂类,所以把工厂类抽象成一个工厂类接口. package

第4章 创建型模式—工厂方法模式(2)

2. 工厂方法模式 2.1工厂方法模式的定义 (1)定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类的实例化延迟到其子类 ①Product:定义了工厂方法创建对象的接口.也就是实际需要使用的产品对象的接口 ②ConcreteProduct:具体的Product接口的实现对象. ③Factory(Creator):定义了工厂方法的抽象类并返回一个产品对象. ④ConcreteCreator:具体的创建器对象,该类实现和覆盖了父工厂类声明的方法.返回一个具体的Product实例

(转)设计模式(五)简单工厂模式+工厂方法模式

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和

简单工厂模式--工厂方法模式(简介)

一.简单工厂模式(静态工厂) 简单工厂模式不属于23种标准设计模式 简单工厂模式是工厂方法模式的一个特殊的实现 简单工厂就是由一个工厂类根据传入的参数决定创建出哪一种产品类的实例  二.实现 产品接口或者抽象类 package factory; /* * 产品接口 */ public interface Product { //生产工艺 public void craftwork(); //产品类型 public void type(); } 实现的子类 package factory; /*

PHP面向对象-设计模式 单例模式 简单工厂模式 工厂方法模式

1.单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例. 要实现每一个类只有一个实例,就需要对实例化进行限制. 单例模式实现要点: ① 构造函数私有化,不允许使用new关键字创建对象  ② 对外提供获取对象的方法.在方法中判断对象是否为空,如果为空则创建对象并返回,如果不为空则直接返回  ③ 实例对象的属性以及获取对象的方法必须是静态的  ④ 之后,创建对象只能使用我们提供的静态方法.