工厂方法模式(Factory Method Pattern)
1.定义:定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象,即将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品的创建。
2.所遵循的设计原则:
a."开-闭"原则
b.依赖倒置原则
a."开-闭"原则
b.依赖倒置原则
3.代码实现:
a.结构截图:
b.代码具体实现:
FruitFactory:
a.结构截图:
b.代码具体实现:
FruitFactory:
package com.feng.pattern.factory_method_pattern.factory;
import com.feng.pattern.factory_method_pattern.product.AbstractFruit;
public interface FruitFactory {
//水果工厂生产水果
AbstractFruit produceFurit();
}
AppleFactory:
package com.feng.pattern.factory_method_pattern.factory;
import com.feng.pattern.factory_method_pattern.product.AbstractFruit;
import com.feng.pattern.factory_method_pattern.product.Apple;
public class AppleFactory implements FruitFactory {
public AbstractFruit produceFurit() {
return new Apple();
}
}
PearFactory:
package com.feng.pattern.factory_method_pattern.factory;
import com.feng.pattern.factory_method_pattern.product.AbstractFruit;
import com.feng.pattern.factory_method_pattern.product.Pear;
public class PearFactory implements FruitFactory {
public AbstractFruit produceFurit() {
return new Pear();
}
}
AbstractFruit:
package com.feng.pattern.factory_method_pattern.product;
public abstract class AbstractFruit {
//定义水果的名称
private String name;
public AbstractFruit(){
}
public AbstractFruit(String name) {
this.name = name;
}
//获取水果的名称
public String getName() {
return name;
}
//设定水果的名称
public void setName(String name) {
this.name = name;
}
}
Apple:
package com.feng.pattern.factory_method_pattern.product;
public class Apple extends AbstractFruit {
public Apple() {
super("Apple");
}
}
Pear:
package com.feng.pattern.factory_method_pattern.product;
public class Pear extends AbstractFruit {
public Pear() {
super("Pear");
}
}
测试类
FactoryMethodTest:
package junit.test;
import org.junit.BeforeClass;
import org.junit.Test;
import com.feng.pattern.factory_method_pattern.factory.AppleFactory;
import com.feng.pattern.factory_method_pattern.factory.FruitFactory;
import com.feng.pattern.factory_method_pattern.factory.PearFactory;
import com.feng.pattern.factory_method_pattern.product.AbstractFruit;
public class FactoryMethodTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test
public void produceApple(){
FruitFactory factory = new AppleFactory();
AbstractFruit fruit = factory.produceFurit();
System.out.println("工厂生产了"+fruit.getName());
}
@Test
public void producePear(){
FruitFactory factory = new PearFactory();
AbstractFruit fruit = factory.produceFurit();
System.out.println("工厂生产了"+fruit.getName());
}
}