工厂设计模式

 本文从以下方面介绍工厂模式

一、总述

二、工厂方法

三、抽象工厂

 

一、总述

1、分类:

(1)简单工厂(静态工厂)

(2)工厂方法模式

(3)抽象工厂模式

 

 2、工厂模式意义:

      将程序中创建对象的部分单独抽取出来,实现与主程序之间的解耦。具有更好的扩展性及维护性。

 

3、工厂方法模式与抽象工厂模式异同点

 

(1)相同点:都是将对象(产品)单独抽取形成一个产品族,然后将创建对象的工厂也向上抽取形成一个工厂族

 

(2)异同点:

         ①抽象工厂中会有一系列的产品,而工厂方法中只有一个抽象的产品;

         ②抽象工厂模式的具体工厂中可以创建多个产品的实例,而工厂方法的具体工厂中只能创建一个产品的实例

 

(3)工厂方法模式中的角色:

         ①一个单一的抽象的产品类,该类可以创建出多个同类型的具体产品类;

         ②一个抽象工厂类,可以创建出多个具体的工厂类,每个工厂类也只能生产一种产品

 

(4)抽象工厂模式的角色:

         ①多个抽象的产品类,可以创建出多种类型的多个具体产品;

         ②一个抽象工厂类,可以创建出多个具体的工厂,每个工厂可以生产出多种产品

 

二、工厂方法

引入:任意定制交通工具的类型(一种产品)和生产过程

1、类图



 2、代码示例

2.1、交通工具接口

package net.oschina.design.factory1.factorymethod;

/**
 * 交通工具的接口类,定制任何一种与交通工具相关的产品
 * 
 * @author Freedom
 * 
 */
public interface Vehicle {

	/**
	 * vehicel run
	 */
	void run();
}

 2.1.1交通工具的具体实现

package net.oschina.design.factory1.factorymethod;

public class Air implements Vehicle {

	@Override
	public void run() {
		System.out.println("Air like lightning fly...--飞机。");
	}

}

 

package net.oschina.design.factory1.factorymethod;

public class Car implements Vehicle {

	@Override
	public void run() {
		System.out.println("Car quickly run...--汽车。");
	}

}

 

package net.oschina.design.factory1.factorymethod;

public class Train implements Vehicle {

	@Override
	public void run() {
		System.out.println("Train wu wu wu run...--火车。");
	}

}

2.2 交通工具的工厂接口

package net.oschina.design.factory1.factorymethod;

/**
 * 
 * @author Freedom
 * 
 */
public interface VehicleFactory {

	Vehicle createVehicle();
}

2.2.1具体的工厂实现类、

package net.oschina.design.factory1.factorymethod;

/**
 * 
 * @author Freedom
 * 
 */
public class AirFactory implements VehicleFactory {

	@Override
	public Vehicle createVehicle() {
		return new Air();
	}
}

 

package net.oschina.design.factory1.factorymethod;

/**
 * @author Freedom
 * 
 */
public class CarFactory implements VehicleFactory {

	@Override
	public Vehicle createVehicle() {
		/*
		 * 此处,可以定制小汽车的生产过程等等,此方法只是简单实现
		 */
		return new Car();
	}

}

 

package net.oschina.design.factory1.factorymethod;

/**
 * 
 * @author Freedom
 * 
 */
public class TrainFactory implements VehicleFactory {

	@Override
	public Vehicle createVehicle() {
		return new Train();
	}

}

2.3、测试方法

package net.oschina.design.factory1.factorymethod;

/**
 * 测试工厂方法模式 
 *工厂方法模式的优点:将对象的创建过程交给一个工厂去完成,实现了程序主流程创建对象时低耦合
 * 缺点:每新增一种产品的时候,产品类需要新增加,具体生产该产品的工厂也要新增加,这样会导致工厂泛滥
 * 可以将一系列产品放到同一个工厂中,这样如果该产品的系列不变化,只是增加产品的种类就不会引起工厂泛滥,要用到抽象工厂的方法
 * @author Freedom
 * 
 */
public class Main {

	public static void main(String[] args) {

		VehicleFactory f = new CarFactory();
		Vehicle c = f.createVehicle();
		c.run();

		f = new AirFactory();
		Vehicle air = f.createVehicle();
		air.run();
	}

}

 

2.4、工厂方法模式的组成

       1)抽象工厂:工厂方法模式的核心。是具体工厂角色必须实现的接口或者必须继承的父类;

       2)具体工厂:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象; 

       3)抽象产品:它是具体产品继承的父类或者是实现的接口;

       4)具体产品:具体工厂角色所创建的对象就是此角色的实例,在java中由具体的类来实现。 

 

三、抽象工厂

引入:任意定制系列产品(如:交通工具...多种产品)

1、类图



 2、代码示例

2.1、产品接口

package net.oschina.design.factory1.abstractFactory;

/**
 * 交通工具类
 * 
 * @author Freedom
 * 
 */
public interface Vehicle {

	void run();
}

 

package net.oschina.design.factory1.abstractFactory;

/**
 * 武器类
 * 
 * @author Freedom
 * 
 */
public interface Weapon {

	void shoot();
}

2.1.1产品具体实现

package net.oschina.design.factory1.abstractFactory;

public class Car implements Vehicle {

	@Override
	public void run() {
		System.out.println("Car quickly run...--汽车。");
	}

}

  

package net.oschina.design.factory1.abstractFactory;

public class Train implements Vehicle {

	@Override
	public void run() {
		System.out.println("Train wu wu wu run...--火车。");
	}

}

 

package net.oschina.design.factory1.abstractFactory;

public class Gun implements Weapon {

	@Override
	public void shoot() {
		System.out.println("Gun shotting...--枪。");
	}

}

 

package net.oschina.design.factory1.abstractFactory;

public class Tank implements Weapon {

	@Override
	public void shoot() {
		System.out.println("Tank shooting...--坦克。");
	}

}

 

2.2、抽象工厂抽象类

package net.oschina.design.factory1.abstractFactory;

/**
 * 抽象工厂用于生产一系列产品
 * 
 * @author Freedom
 * 
 */
public abstract class AbstractFactory {

	public abstract Vehicle createVehicle();

	public abstract Weapon createWeapon();
}

 2.2.1抽象工厂的具体实现

package net.oschina.design.factory1.abstractFactory;

/**
 * 生产大型工具的工厂
 * 
 * @author Freedom
 * 
 */
public class BigToolsFactory extends AbstractFactory {

	@Override
	public Vehicle createVehicle() {
		return new Train();
	}

	@Override
	public Weapon createWeapon() {
		return new Tank();
	}

}

 

package net.oschina.design.factory1.abstractFactory;

/**
 * 小型工具的工厂
 * 
 * @author Freedom
 * 
 */
public class SmallToolsFactory extends AbstractFactory {

	@Override
	public Vehicle createVehicle() {
		// TODO Auto-generated method stub
		return new Car();
	}

	@Override
	public Weapon createWeapon() {
		// TODO Auto-generated method stub
		return new Gun();
	}

}

2.3、运行类

package net.oschina.design.factory1.abstractFactory;

/**
 * 测试抽象工厂
 * 
 * @author Freedom
 * 
 */
public class Main {
	public static void main(String[] args) {
		/**
		 * 如果想替换工厂的时,直接将工厂的实现对象替换即可,程序的代码不需要修改
		 */
		AbstractFactory f = new SmallToolsFactory();
		Vehicle v = f.createVehicle();
		v.run();
		Weapon w = f.createWeapon();
		w.shoot();
	}
}

  

2.4、抽象工厂优缺点

(1)抽象工厂模式的优点

①分离接口和实现

  客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。

②使切换产品族变得容易

  因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从Intel系列到AMD系列只需要切换一下具体工厂。

(2)抽象工厂模式的缺点

①不太容易扩展新的产品系列

  如果需要给整个产品族添加一个新的产品系列,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。

 

 

 

可参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值