工廠方法(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();
}
}