1 工厂方法模式
实例
public class Demo{
public static void main(String[] args) {
// 创建苹果工厂
FruitGardener fruitGardener = new AppleGardener();
// 通过工厂生产苹果
Fruit apple = fruitGardener.factory();
apple.grow();
apple.harvest();
apple.plant();
}
}
/**
* 创建一个FruitGardener(抽象工厂)
*/
interface FruitGardener {
public Fruit factory();
}
/**
* 具体工厂
*/
class AppleGardener implements FruitGardener{
@Override
public Fruit factory() {
return new Apple();
}
}
class GrapeGardener implements FruitGardener{
@Override
public Fruit factory() {
return new Grape();
}
}
/**
* Fruit(抽象产品)
*/
interface Fruit {
public void grow();
public void harvest();
public void plant();
}
/**
* 具体产品
*/
class Grape implements Fruit{
@Override
public void grow() {
System.out.println("Grape grow");
}
@Override
public void harvest() {
System.out.println("Grape harvest");
}
@Override
public void plant() {
System.out.println("Grape plant");
}
}
class Apple implements Fruit{
@Override
public void grow() {
System.out.println("Apple grow");
}
@Override
public void harvest() {
System.out.println("Apple harvest");
}
@Override
public void plant() {
System.out.println("Apple plant");
}
}
Apple grow
Apple harvest
Apple plant
理论
抽象工厂Interface Creator
public interface Creator {
public <T extends Product> T factory(Class<T> c);
}
public interface FruitGardener {
public Fruit factory();
}
<T extends Product> T
== Fruit : 抽象工厂生产的抽象产品
具体工厂Concrete Creator
public class ConcreteCreator implements Creator {
public <T extends Product> T factory(Class<T> c) {
Product product = null;
try {
product = (Product) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
}
return (T) product;
}
}
class AppleGardener implements FruitGardener{
@Override
public Fruit factory() {
return new Apple();
}
}
抽象产品
**
* Fruit(抽象产品)
*/
interface Fruit {
public void grow();
public void harvest();
public void plant();
}
具体产品
/**
* 具体产品
*/
class Grape implements Fruit{
@Override
public void grow() {
System.out.println("Grape grow");
}
@Override
public void harvest() {
System.out.println("Grape harvest");
}
@Override
public void plant() {
System.out.println("Grape plant");
}
}