1.从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂模式(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
UML图:
这个图会更加易懂一点:
2.包括三个角色:
- 工厂(Creator)角色:简单工厂模式的核心,它所负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
- 抽象产品(Product)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
- 具体产品(Concrete Product)角色:是简单工厂模式所创建的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
3.个人理解:
- 简单工厂模式中的Project角色是定义了一个接口,在接口中又定义了公用的接口,供具体类来继承实现。
- Concrete Project角色是继承了接口,重写了具体的方法,像封装具体的数据那样定义好之后随时等待被调用。
- Creator角色是将定义一个返回Product类型的方法,根据各种情况对具体类进行调用。
4.代码实现
- 抽象产品(Product)角色类
public interface BasketballPlayer {
public void shot();
public void pass();
public void block();
}
- 具体产品(Concrete Product)角色类
public class Kobe implements BasketballPlayer {
private String name = "Kobe";
@Override
public void shot() {
// TODO Auto-generated method stub
System.out.println(name + " shot");
}
@Override
public void pass() {
// TODO Auto-generated method stub
System.out.println(name + " pass");
}
@Override
public void block() {
// TODO Auto-generated method stub
System.out.println(name + " block");
}
}
public class Jordan implements BasketballPlayer {
private String name = "Jordan";
@Override
public void shot() {
// TODO Auto-generated method stub
System.out.println(name + " shot");
}
@Override
public void pass() {
// TODO Auto-generated method stub
System.out.println(name + " pass");
}
@Override
public void block() {
// TODO Auto-generated method stub
System.out.println(name + " block");
}
}
public class Luoyifei implements BasketballPlayer {
private String name = "Luoyifei";
@Override
public void shot() {
// TODO Auto-generated method stub
System.out.println(name + " shot");
}
@Override
public void pass() {
// TODO Auto-generated method stub
System.out.println(name + " pass");
}
@Override
public void block() {
// TODO Auto-generated method stub
System.out.println(name + " block");
}
}
- 工厂(Creator)角色类
public class BasketballPlayerFactory {
public static BasketballPlayer createInstance(String name) {
BasketballPlayer bp = null;
switch(name) {
case "Kobe":
bp = new Kobe();
break;
case "Jordan":
bp = new Jordan();
break;
case "Luoyifei":
bp = new Luoyifei();
break;
}
return bp;
}
}
- 客户端调用
public class StaticFactoryMethod {
public static void main(String[] args) {
BasketballPlayer bPlayer = BasketballPlayerFactory.createInstance("Luoyifei");
bPlayer.shot();
bPlayer.block();
bPlayer.pass();
}
}