设计模式之工厂模式

        工厂模式是用来创建对象的设计模式,工厂模式又分为简单工厂模式工厂方法模式抽象工厂模式三种,下面依次介绍

一、简单工厂模式

1、详细介绍

        简单工厂模式是最简单的一种。专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,这称为静态工厂方法模式,属于类的创建型模式。其实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例,并且这些产品类继承自一个父类或接口,该模式中包含的角色有以下几个方面:        

        (1)抽象角色(Product):简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口;

        (2)具体产品角色(Concrete Product):简单工厂模式的创建目标,是一个具体的实例对象,所有创建的对象都是充当这个角色的某个具体类的实例。一般来讲它是抽象产品类的子类,实现了抽象产品类中定义的所有接口方法;

        (3)工厂角色(Factory):它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象;

        该模式中工厂类是整个模式的关键所在,它包含必要的判断逻辑,能根据外界给定的信息决定究竟创建哪个具体的对象。用户在使用时可以直接根据工厂类创建所需要的实例,而无须了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。但是简单工厂模式的缺点也正体现在其工厂类上---如果当前系统中具体产品类不断增多,可能会出现要求工厂类也要做相应的比较大的发动,扩展并不友好。

2、举例实现       

下面以汽车为产品创建简单工厂模式的举例:

//简单工厂模式

abstract class Auto {//汽车抽象类
	public abstract void print();
}

class Car extends Auto {//轿车
	public void print() {
		System.out.println("Car!");
	}
}

class Truck extends Auto {//卡车
	public void print() {
		System.out.println("Truck!");
	}
}

class AutoFactory {// 简单工厂模式的工厂类
	public static Auto createAuto(int autoType) {//根据传递的参数创建不同的实例
		if (autoType == 0)
			return new Car();
		else if (autoType == 1)
			return new Truck();
		return null;
	}
}

public class FactorySimple {

	public static void main(String[] args) {
		Auto car = AutoFactory.createAuto(0);
		car.print();

		Auto truck = AutoFactory.createAuto(1);
		truck.print();
	}
}

二、工厂方法模式

1、详细介绍

        简单工厂模式是工厂模式中最简单的一种,它在应对产品类别比较多的时候往往是力不从心,因此就有了工厂方法模式的出现。工厂方法模式是简单工厂模式和衍生,完全实现了“开闭原则”、易扩展;其次具有更复杂的层次结构,可能应用于产品结果复杂的场合。

        工厂方法对简单工厂模式进行了抽象,有一个抽象的Factory类(抽象类或接口),这个类将不再负责具体的产品的生产,而是只制定一些规范(即声明一些方法),具体的生产由其子类完成。该模式下,工厂类和产品类往往可以依次对应,也就是说一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品。例如一个生产汽车的工厂它既可以生产轿车又可以生产卡车,则就先定义一个抽象工厂类,再衍生出轿车类和卡车类,然后在创建汽车时只需要调用抽象工厂的方法即可利用JVM多态的原理创建出特定类型的汽车。
2、举例实现
//工厂模式

abstract class Auto{
	public abstract void print();
}

class Car extends Auto{
	public void print(){
		System.out.println("Car!");
	}
}

class Truck extends Auto{
	public void print(){
		System.out.println("Truck!");
	}
}

abstract class AbstractAutoFactory{//抽象汽车工厂
	public abstract Auto createAuto();
}

class CarFactory extends AbstractAutoFactory{//轿车工厂
	public Auto createAuto(){
		return new Car();
	}
}

class TruckFactory extends AbstractAutoFactory{//卡车工厂
	public Auto createAuto() {
		return new Truck();
	}
	
}

public class FactoryMethod {
	public static void main(String[] args) {
		AbstractAutoFactory fac1 = new CarFactory();
		fac1.createAuto().print();
		
		AbstractAutoFactory fac2 = new TruckFactory();
		fac2.createAuto().print();
	}
}

三、抽象工厂模式

1、具体介绍

        当抽象的角色不止一个的时候,工厂需要造出多种产品并且这些产品是有联系的时候,简单工厂模式和工厂方法模式就难以解决问题了,因此引用了抽象工厂模式。抽象工厂模式是所有形态的工厂模式中最为抽象的、最具一般性的一种形态,它是当有多个抽象角色时使用和一种模式,可以向客户端提供一个接口,使用者在不必指定产品的具体的情况下创建多个产品族中的产品对象。

        当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?如当抽象产品角色有两个具体产品时,抽象工厂模式提供两个具体工厂角色分别对应于这两个具体产品角色,每一个具体工厂角色只负责一个产品角色的实例化,每个具体工厂类只负责创建抽象产品的某一个具体子类的实例。如一个抽象的汽车工厂可以生产汽车及其配套的轮子,它的子类工厂是轿车工厂的卡车工厂,轿车工厂生产轿车和轿车轮子,卡车工厂则生产卡车和卡车轮子。

        由于每个具体工厂角色都需要负责两个不同等级结构的产品对象的创建,因此每个工厂角色都需要提供两个工厂方法,分别用于创建两个等级结构的产品。既然每个具体工厂角色都需要实现这两个方法,所以具有一般性,抽象出来,移动到抽象工厂角色中加以声明。

2、举例实现

//抽象工厂方法

//车类
abstract class Auto{
	public abstract void print();
}
class Car extends Auto{
	public void print() {
		System.out.println("Car!");
	}	
}
class Truck extends Auto{
	public void print() {
		System.out.println("Truck!");
	}	
}

//零件类
abstract class Wheel{
	public abstract void print();
}
class CarWheel extends Wheel{
	public void print() {
		System.out.println("CarWheel!");
	}	
}
class TruckWheel extends Wheel{
	public void print(){
		System.out.println("TruckWheel!");
	}
}

//抽象工厂方法模式:
//可以生成多种不同的产品,且这些产品之间有一定的联系
interface CreateWheelAble{
	public abstract Wheel createWheel();
}
abstract class AbstractAutoFactory implements CreateWheelAble{
	public abstract Auto createAuto();
}

class CarFactory extends AbstractAutoFactory{
	public Wheel createWheel() {
		return new CarWheel();
	}
	public Auto createAuto() {
		return new Car();
	}	
}

class TruckFactory extends AbstractAutoFactory{
	public Wheel createWheel() {
		return new TruckWheel();
	}
	public Auto createAuto() {
		return new Truck();
	}	
}

public class FactoryAbstract {
	public static void main(String[] args) {
		AbstractAutoFactory aaf1 = new CarFactory();//生产轿车
		aaf1.createAuto().print();
		aaf1.createWheel().print();
		
		AbstractAutoFactory aaf2 = new TruckFactory();//生产卡车
		aaf2.createAuto().print();
		aaf2.createWheel().print();
	}
}





        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值