工厂方法FactoryMethod
概述
根据具体工厂获取对应产品,客户端无需关注产品构建过程
场景
用于生产单个产品
实现
定义抽象工厂接口,申明构建产品方法
/**
* 抽象工厂接口
*/
public interface IFactory {
/**
* 构建产品方法
* @return
*/
Product newProduct();
}
定义抽象产品接口
/**
* 抽象产品
*/
public interface Product {
void showName();
}
定义具体工厂用于生产具体产品
/**
* PC工厂生产PC
*/
public class PCFacotry implements IFactory {
@Override
public Product newProduct() {
System.out.println("PCFacotry create PC");
return new PCProduct();
}
}
定义具体产品
/**
* PC产品
*/
public class PCProduct implements Product {
@Override
public void showName() {
System.out.println("I am a PC");
}
}
测试
/**
* 测试构建产品
*/
public class FactoryMethodTest {
@Test
public void testFactoryMethod(){
IFactory pcFactory = new PCFacotry();
Product pc = pcFactory.newProduct();
pc.showName();
}
}
执行结果
抽象工厂AbstractFactory
概述
为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品
场景
用于生产一个产品族产品
实现
抽象工厂接口,声明创建产品方法
/**
* 养殖场接口
*/
public interface FarmFactory {
/**
* 生产鱼
* @return
*/
Fish newFish();
/**
* 生产虾
* @return
*/
Shrimp newShrimp();
}
具体工厂
/**
* 具体工厂
*/
public class FishFactory implements FarmFactory{
@Override
public Fish newFish() {
System.out.println("Fish工厂开始生产鱼");
return new BlackFish();
}
@Override
public Shrimp newShrimp() {
System.out.println("Fish工厂开始生产虾");
return new Crayfish();
}
}
抽象产品:
/**
* 产品1:鱼
*/
public interface Fish {
void showName();
}
/**
* 产品2:虾
*/
public interface Shrimp {
void showName();
}
具体产品
/**
* 具体鱼:黑鱼
*/
public class BlackFish implements Fish{
@Override
public void showName() {
System.out.println("我是黑鱼");
}
}
/**
* 小龙虾
*/
public class Crayfish implements Shrimp{
@Override
public void showName() {
System.out.println("我是小龙虾");
}
}
测试
public class AbstractFactoryTest {
@Test
public void testAbstractFactory(){
FarmFactory factory = new FishFactory();
Fish fish = factory.newFish();
fish.showName();
Shrimp shrimp = factory.newShrimp();
shrimp.showName();
}
}
测试结果
总结
1、工厂方法适合生产单个产品,抽象工厂适合生产一个产品族
2、客户端不用关心具体产品的构建细节
3、使用抽象工厂时,若需要在原有产品族种增加新的产品则需要对应改动抽象工厂接口和抽象工厂,破坏开闭原则。
有不正确之处欢迎大家批评指正