1.简单工厂
简单工厂模式(Simple Factory Pattern),又叫静态工厂方法模式(Static FactoryMethod Pattern),
是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式分离产品的创建者和消费者,有利于软件系统结构的优化;
但是由于一切逻辑都集中在一个工厂类中,导致了没有很高的内聚性,同时也违背了“开放封闭原则”。
另外,简单工厂模式的方法一般都是静态的,而静态工厂方法是无法让子类继承的,
因此,简单工厂模式无法形成基于基类的继承树结构。
2.结构图
3.代码
package com.hlf.designPatterns.SimpleFactory;
/**
* 食物接口,其他食物实现这个接口,
* 它的实现类是各种食品,从而创建一个食品工厂
* 在工厂类里就可以根本传入的不同而选择食品
* Created by hlf on 2016/8/24.
*/
public interface Food {
void getFood();
}
package com.hlf.designPatterns.SimpleFactory;
/**
* 蛋糕类,实现食物接口
* Created by hlf on 2016/8/24.
*/
public class Cake implements Food{
@Override
public void getFood() {
System.out.println("一个好看又好吃的蛋糕");
}
}
package com.hlf.designPatterns.SimpleFactory;
/**
* 大米类,实现食物接口
* Created by hlf on 2016/8/24.
*/
public class Rice implements Food{
@Override
public void getFood() {
System.out.println("香喷喷的大米饭");
}
}
package com.hlf.designPatterns.SimpleFactory;
/**
* 猪肉类,实现食物接口
* Created by hlf on 2016/8/24.
*/
public class Pig implements Food{
@Override
public void getFood() {
System.out.println("色香味俱全的状元猪脚");
}
}
package com.hlf.designPatterns.SimpleFactory;
import java.lang.Exception;
/**
* 简单工厂类,负责各种食品的创建,
* 一般会传入创建的物品类型,根据要求创建出对应食品
* Created by hlf on 2016/8/24.
*/
public class SimpleFactory {
public Food getFood(String type) throws IllegalAccessException, InstantiationException {
if ("cake".equals(type)) {
return Cake.class.newInstance();//也可以直接new Cake()
} else if ("rice".equals(type)) {
return Rice.class.newInstance();
} else if ("pig".equals(type)) {
return Pig.class.newInstance();
} else {
System.out.println("what is this? I can't create it!");
}
return null;
}
}
package com.hlf.designPatterns.SimpleFactory;
/**
* 多个工厂方法模式,是对普通工厂方法模式的改进,
* 在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,
* 而多个工厂方法模式是提供多个工厂方法,分别创建对象。
* Created by hlf on 2016/8/24.
*/
public class SomeFactory {
//其实也就是单纯把创建类的实现一起放到一个类里罢了。
public Food getCake(){
return new Cake();
}
public Food getRice(){
return new Rice();
}
public Food getPig(){
return new Pig();
}
}
package com.hlf.designPatterns.SimpleFactory;
/**
* 静态工厂方法,创建类实例,这就最提倡使用的
* 将上面的多个工厂方法模式里的方法置为静态的,
* 不需要创建实例,直接调用即可。
* Created by hlf on 2016/8/24.
*/
public class StaticFactory {
public static Food getCake(){
return new Cake();
}
public static Food getRice(){
return new Rice();
}
public static Food getPig(){
return new Pig();
}
}
package com.hlf.designPatterns.SimpleFactory;
/**
* 测试
* Created by hlf on 2016/8/24.
*/
public class TestFactory {
public static void main(String[] args) throws Exception{
System.out.println("先是用简单工厂方法创建");
//先来碗米饭,先得到实例,之后调用其方法
SimpleFactory simpleFactory = new SimpleFactory();
Food rice = simpleFactory.getFood("rice");
rice.getFood();
System.out.println("再用多个工厂方法模式创建");
//再来块蛋糕
SomeFactory someFactory = new SomeFactory();
Food cake = someFactory.getCake();
cake.getFood();
System.out.println("最后用静态工厂方法创建");
//最后来个状元猪脚
Food pig = StaticFactory.getPig();
pig.getFood();
}
}
结果
先是用简单工厂方法创建
香喷喷的大米饭
再用多个工厂方法模式创建
一个好看又好吃的蛋糕
最后用静态工厂方法创建
色香味俱全的状元猪脚