設計模式案例--工廠模式--工廠方法(factory method)

工廠方法(factory method)

工廠方法模式針對的是一個產品等級結構,下面是按照兩種不同的等級結構思想來設計的

(1)方式一

1、抽象工廠類

package com.dou361.factory;

import com.dou361.car.AudiCar;
import com.dou361.car.BenzCar;
import com.dou361.car.BmwCar;
import com.dou361.car.BydCar;

public interface CarFactory {
	BmwCar ceateBmwCar();
	BydCar ceateBydCar();
	AudiCar ceateAudiCar();
	BenzCar ceateBenzCar();
}

2、工廠類的實現類

package com.dou361.factory.impl;

import com.dou361.car.AudiCar;
import com.dou361.car.BenzCar;
import com.dou361.car.BmwCar;
import com.dou361.car.BydCar;
import com.dou361.car.impl.BussinessAudiCar;
import com.dou361.car.impl.BussinessBenzCar;
import com.dou361.car.impl.BussinessBmwCar;
import com.dou361.car.impl.BussinessBydCar;
import com.dou361.factory.CarFactory;

public class BussinessCarFactory implements CarFactory {

	@Override
	public BmwCar ceateBmwCar() {
		return new BussinessBmwCar();
	}

	@Override
	public BydCar ceateBydCar() {
		return new BussinessBydCar();
	}

	@Override
	public AudiCar ceateAudiCar() {
		return new BussinessAudiCar();
	}

	@Override
	public BenzCar ceateBenzCar() {
		return new BussinessBenzCar();
	}

}

3、抽象汽車類

package com.dou361.car;

public interface AudiCar extends Car {

}

package com.dou361.car;

public interface BenzCar extends Car {

}

package com.dou361.car;

public interface BmwCar extends Car {

}

package com.dou361.car;

public interface BydCar extends Car {

}


package com.dou361.car;

/**
 * @author Admin
 *抽象產品角色
 */
public interface Car {
	/**
	 * 開車的方法
	 */
	void drive();
}

4、汽車類實現類

package com.dou361.car.impl;

import com.dou361.car.AudiCar;

public class BussinessAudiCar implements AudiCar {

	@Override
	public void drive() {
		System.out.println("商務Audi在開...");
	}

}

package com.dou361.car.impl;

import com.dou361.car.BenzCar;

public class BussinessBenzCar implements BenzCar {

	@Override
	public void drive() {
		System.out.println("商務Benz在開...");
	}

}

package com.dou361.car.impl;

import com.dou361.car.BmwCar;

public class BussinessBmwCar implements BmwCar {

	@Override
	public void drive() {
		System.out.println("商務Bmw在開...");
	}

}

package com.dou361.car.impl;

import com.dou361.car.BydCar;

public class BussinessBydCar implements BydCar {

	@Override
	public void drive() {
		System.out.println("商務Byd在開...");
	}

}

5、測試類文件

package com.dou361.test;

import com.dou361.car.AudiCar;
import com.dou361.factory.CarFactory;
import com.dou361.factory.impl.BussinessCarFactory;

public class Magnate {
	public static void main(String[] args) {
		CarFactory carFactory = new BussinessCarFactory();
		AudiCar audiCar = carFactory.ceateAudiCar();
		audiCar.drive();
	}
}

(2)方式二

1、抽象工廠類

package com.dou361.factory;

import com.dou361.car.Car;

/**
 * @author Admin
 *抽象工廠角色
 */
public interface CarFactory {
	
	Car driverCar() ;
	
}

2、工廠類的實現類

package com.dou361.factory.impl;

import com.dou361.car.Car;
import com.dou361.car.impl.AudiCar;
import com.dou361.factory.CarFactory;

/**
 * @author Admin
 *具體工廠角色
 */
public class AudiCarFactory implements CarFactory {

	@Override
	public Car driverCar() {
		return new AudiCar();
	}

}

package com.dou361.factory.impl;

import com.dou361.car.Car;
import com.dou361.car.impl.BenzCar;
import com.dou361.factory.CarFactory;

/**
 * @author Admin
 *具體工廠角色
 */
public class BenzCarFactory implements CarFactory {

	@Override
	public Car driverCar() {
		return new BenzCar();
	}

}

package com.dou361.factory.impl;

import com.dou361.car.Car;
import com.dou361.car.impl.BmwCar;
import com.dou361.factory.CarFactory;

/**
 * @author Admin
 *具體工廠角色
 */
public class BmwCarFactory implements CarFactory {

	@Override
	public Car driverCar() {
		return new BmwCar();
	}

}

package com.dou361.factory.impl;

import com.dou361.car.Car;
import com.dou361.car.impl.BydCar;
import com.dou361.factory.CarFactory;

public class BydCarFactory implements CarFactory {

	@Override
	public Car driverCar() {
		return new BydCar();
	}

}

3、抽象汽車類

package com.dou361.car;

/**
 * @author Admin
 *抽象產品角色
 */
public interface Car {
	/**
	 * 開車的方法
	 */
	void drive();
}

4、具體汽車類

package com.dou361.car.impl;

import com.dou361.car.Car;


/**
 * @author Admin
 *具體類角色
 */
public class AudiCar implements Car {

	@Override
	public void drive() {
		System.out.println("開的是Audi車...");
	}

}

package com.dou361.car.impl;

import com.dou361.car.Car;


/**
 * @author Admin
 *具體類角色
 */
public class BenzCar implements Car {

	@Override
	public void drive() {
		System.out.println("開的是Benz車...");
	}

}

package com.dou361.car.impl;

import com.dou361.car.Car;


/**
 * @author Admin
 *具體類角色
 */
public class BmwCar implements Car {

	@Override
	public void drive() {
		System.out.println("開的是Bmw車...");
	}

}

package com.dou361.car.impl;

import com.dou361.car.Car;

public class BydCar implements Car {

	@Override
	public void drive() {
		System.out.println("開的是Byd車..");
	}

}

5、測試類

package com.dou361.test;

import com.dou361.car.Car;
import com.dou361.factory.CarFactory;
import com.dou361.factory.impl.BenzCarFactory;
import com.dou361.factory.impl.BydCarFactory;

/**
 * @author Admin
 *1)  抽象工廠角色: 這是工廠方法模式的核心,它與應用程序無關。是具體工廠角色必須
 *實現的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現。
 *2)  具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程序調用以創建對應的具體
 *產品的對象。 
 *3)  抽象產品角色:它是具體產品繼承的父類或者是實現的接口。在java 中一般有抽象類
 *或者接口來實現。
 *4)  具體產品角色:具體工廠角色所創建的對象就是此角色的實例。在java 中由具體的類
 *來實現。
 *用類圖來清晰的表示
 */
public class Magnate {
	public static void main(String[] args) {
		CarFactory carFactory = new BenzCarFactory();
		Car car = carFactory.driverCar();
		car.drive();
		
		CarFactory factory = new BydCarFactory();
		Car bydCar = factory.driverCar();
		bydCar.drive();
	}
}









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章