菜鸟学设计模式系列笔记之工厂方法模式

工厂方法模式(Factory Method):

Alias :virtual constructory 虚构造器

Intent: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

Motivation:一个框架使用抽象类定义和管理对象之间的关系。这个框架负责去创建这些对象。

工厂方法模式是类的创建模式,又叫做虚拟构造子模式(Virtual Constructor)或者多态性(Polymorphic Factory)工厂模式

工厂方法模式是简单工厂模式的进一步抽象和推广,其基本思想是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。

在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种具体细节。

工厂方法模式可用来允许系统再不修改具体工厂角色的情况下引进新的产品。

实际例子:

在射击游戏中,冲锋枪、狙击枪、手枪等不同武器(Weapon)的外观、使用方法和杀伤力都不相同,

玩家可以使用不同的武器,而且游戏升级时还可以增加新的武器,无需对现有系统做太多修改,如何设计武器系统?

实际设计的类:

Factory.java 类

public interface Factory {
	public Weapon CreateWeapon();
}
//Weapon.java
public interface Weapon {
	public void apperance();
	public void killablility();
	public void usage();
}
public class AWP implements Weapon {

	public AWP() {
		System.out.println("new AWP()");
	}

	public void apperance(){
		System.out.println("new AWP() apperance()");
	}

	public void killablility(){

	}

	public void usage(){

	};
}
public class HandGun implements Weapon {

	public HandGun(){
		System.out.println("new HandGun");
	}

	public void apperance(){
		System.out.println("new HandGun() apperance()");
	}

	public void killablility(){

	};

	public void usage(){

	};
}
public class SubmachineGun implements Weapon {

	public SubmachineGun(){
		System.out.println("new SubmachineGun()");
	}

	public void apperance(){
		System.out.println("new SubmachineGun() apperance()");
	};

	public void killablility(){

	};

	public void usage(){

	};
}
public class AWPFactory implements Factory {

	public AWPFactory() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Weapon CreateWeapon(){
		System.out.println("CreateWeapon()");
		return new AWP();
	}
}
</pre><pre code_snippet_id="653785" snippet_file_name="blog_20150427_8_8831320" name="code" class="java">public class HandGunFactory implements Factory {

	public HandGunFactory() {
		super();
		// TODO Auto-generated constructor stub
	}

	@Override
	public Weapon CreateWeapon() {
		// TODO Auto-generated method stub
		System.out.println("create HandGun()");
		return new HandGun();
	}

}
public class SubmachineGunFactory implements Factory {

	public SubmachineGunFactory() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Weapon CreateWeapon(){
		System.out.println("CreateWeapon()");
		return new SubmachineGun();
	}
}
public class Client {
	public static void main(String[] arg){
		AWPFactory aFactory=new AWPFactory();
		AWP awp=(AWP) aFactory.CreateWeapon();

		HandGunFactory hFactory=new HandGunFactory();
		HandGun handGun=(HandGun) hFactory.CreateWeapon();

		SubmachineGunFactory sFactory=new SubmachineGunFactory();
		SubmachineGun submachineGun=(SubmachineGun) sFactory.CreateWeapon();

	}

}

工厂方法模式涉及到抽象工厂角色(Creator)、具体工厂角色(Concrete Creator)、抽象产品(Product)角色及具体产品(Concrete Product)等四个角色,大体结构如下:

在以下情况下可以使用工厂方法模式:

1、一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品的类名,只需要知道对应的工厂即可,具体的产品对象有具体的工厂类创建;客户端只需要知道创建具体产品的工厂类。

2、一个类通过其子类来指定创建那个对象:在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏替换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。

3、将创建对象的任务委托给多个工厂子类的某一个。客户端在使用时可以无需关系是哪一个工厂子类创建产品子类,需要时在动态指定,可将具体工厂类的类名存储在配置文件或数据库中。

源码包和UML图下载:

时间: 2024-08-04 23:46:10

菜鸟学设计模式系列笔记之工厂方法模式的相关文章

菜鸟学设计模式系列笔记之创建型模式简介

设计模式是"封装变化"方法的最佳阐释 无论是创建型模式.结构型模式.还是行为型模式,归根结底都是寻找软件中可能存在的"变化",然后利用抽象的方式对这些变化进行封装. 由于抽象没有具体的实现,就代表了一种无限可能性,使得其扩展成为了可能. 经典设计模式都是在寻找软件中的可能变化,并封装这些变化. 封装通常的理解:将数据(属性)和对数据的操作(方法)放到一个程序单元(类)中,从而使得概念上相关的数据和操作在编程语言上相关:正确的理解:信息隐藏--隐藏细节,对对象内部细节

菜鸟学设计模式系列笔记之Prototype模式(原型模式)

菜鸟学设计模式系列笔记之Prototype模式: Intent: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 Motivation:以一个已有的对象作为原型,通过它来创建新的对象. 在增加新的对象的时候,新对象的细节创建工作由自己来负责,从而使新对象的创建过程与框架隔离开来. 应用场景: (1)当一个系统应该独立于它的产品创建.构成和表示时 (2)当要实例化的类是在运行时刻指定时,例如动态加载 (3)为了避免创建一个产品类层次平行的工厂类层次时 (4)当一个类的实例只能有几个

菜鸟学设计模式系列笔记之抽象工厂模式

抽象工厂模式(Abstract Factory模式): (1)Intent:提供一个创建一系列相关后相互依赖对象的接口,而无需指定它们具体的类-客户端不必指定产品的具体类型,创建多个产品族中的产品对象 (2)Motivation :为保证视感风格标准间的可移植性,应用不应该为一个特定的视感外观硬编码它的窗口组件.在整个应用中实例化特定的视感风格的窗口组建类将使得使得以后很难改变视感的风格. 抽闲工厂模式面对的是多个产品等级结构的系统设计. 工厂方法模式针对的是一个产品等级结构: 抽象工厂模式需要

大话设计模式读书笔记7——工厂方法模式

工厂方法模式 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法是一个类的实例化延迟到其子类. 工厂方法模式UML结构图 工厂方法模式结构代码 /// <summary> /// 声明'Product' 抽象类 /// </summary> abstract class Product { } /// <summary> /// 声明 'ConcreteProductA' 类,继承Product /// <

菜鸟学设计模式系列笔记之单例设计模式(Singleton模式)

特殊的类: (1)类和它的实例间一般是一对多的关系.对大多数的类而言,都可以创建多个实例. 在需要这些实例时创建它们,在这些实例不再有用时删除它们.这些实例的来去伴随着内存的分配和归还. (2)但是有一些类,应该只有一个实例. 这个实例似乎应该在程序启动时被创建出来,且只有在程序结束时才被删除. Intent : 一个类仅有一个实例,自行实例化并向整个系统提供一个访问它的全局访问点 Motivation : 对于一些类来说,只有一个实例是很重要的 Singleton (1)定义一个Instanc

菜鸟学设计模式系列笔记之建造者模式(Builder模式)

提供一种"封装机制"来隔离出"复杂对象的各个部分"的变化. 从而保持系统中的"稳定构建算法"不随需求变化而变化.----建造者模式 建造模式是对象的创建模式 建造模式可以将一个产品的内部表象与产品的生成过程分割开来, 从而可以是一个建造过程生成具有不同的内部表象的产品对象. Intent : 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 Motivation: 在复杂对象的构造过程中,允许同样的构造过程能够加入新的被

菜鸟学设计模式系列笔记之适配器模式(adapter模式)

一.结构模式简介: 在面向对象软件系统中,每个类都承担了一定的职责,它们可以相互协作,实现一些复杂的功能 结构型模式关注的是如何将现有类或对象组织在一起形成更加强大的结构 不同的结构型模式从不同的角度来组合类和对象 1.结构模式描述如何将类或者对象结合在一起形成更大的结构 (1)类的结构模式:类的结构模式使用继承把类.接口等组合在一起,以形成更大的结构.当一个类从父类继承并实现某接口时,这个新的类就把父类的结构和接口的结构组合起来.类的结构模式是静态的. (2)对象的结构模式:对象的结构模式描述

易学设计模式看书笔记(3) - 工厂方法模式

二.工厂方法模式 1.动物管理系统的例子 首先,抽象的动物类和具体的动物实现类: public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } public

设计模式(二)---工厂方法模式

设计模式(二)---工厂方法模式 工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 抽象工厂源代码 public interface Creator { /** * 工厂方法 */ public Product factory(); } 抽象产品