1.简单工厂模式又称为静态工厂模式:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有相同的父类。虽然不属于23中设计模式其一,但是经常会被使用。
/**Product抽象产品角色*/
public abstract class Product{
//所有产品类的公共业务方法
public void methodSame(){
//公共方法的实现
}
//声明抽象业务方法
public abstract void methodDiff();
}
/**具体抽象产品类*/
public class ConcreateProduct extends Product{
//实现业务方法
public void methodDiff(){
//业务方法的实现
}
}
/**工厂类*/
public class Factory{
//静态工厂方法
public static Product getProduct(String arg){
Product product = null;
if(arg.equalsIgnoreCase("A")){
product = new ConcreateProductA();
//初始化设置product
}
else if(arg.equalsIgnoreCase("B")){
product = new ConcreateProductB();
//初始化设置product
}
return product;
}
}
/***在客户端测试*/
public class Client{
public static void main(String args[]){
Product product;
product = Factory.getProduct("A");//通过工厂类创建产品对象
product.methodSame();
product.methodDiff();
}
}
简单工厂模式的核心是工厂类,在没有工厂类之前,客户端一般会使用new关键字之间创建对象,而引入工厂类之后客户端可以通过工厂类来创建产品。
2.简单工厂模式实例描述:一个果篮中有一些水果,小明想吃水果时不用去其他地方去拿,只用在果篮里取就可以。所以要创建一个比较有灵活性的果篮,可以方便的忘果篮中添加或者取出水果。这个果篮就充当工厂。下面代码中Fruit即充当果篮。
/**抽象水果接口,充当抽象产品类*/
public interface Fruit {
public void eat();
}
/**苹果类,充当具体产品类*/
public class Apple implements Fruit {
public Apple(){
System.out.println("拿来了一个苹果");
}
@Override
public void eat() {
System.out.println("吃苹果");
}
}
/**桔子类,充当具体产品类*/
public class Orange implements Fruit {
public Orange(){
System.out.println("拿来了一个桔子");
}
@Override
public void eat() {
System.out.println("吃桔子");
}
}
/**香蕉类,充当具体产品类*/
public class Banana implements Fruit {
public Banana(){
System.out.println("拿来了一个香蕉");
}
@Override
public void eat() {
System.out.println("吃香蕉");
}
}
/**水果工厂类,充当工厂类*/
public class FruitFactory {
public static Fruit getFruit(String type){
Fruit fruit = null;
if(type.equalsIgnoreCase("apple")){
fruit = new Apple();
System.out.println("洗苹果");
}
else if(type.equalsIgnoreCase("orange")){
fruit = new Banana();
System.out.println("洗桔子");
}
else if(type.equalsIgnoreCase("banana")){
fruit = new Orange();
System.out.println("洗香蕉");
}
return fruit;
}
}
/**客户端测试*/
public class Client{
public void test(){
Fruit chart;
chart = FruitFactory.getFruit("apple");//通过静态工厂方法创建产品,还可以换为orange或者banner
chart.eat();
}
}
实例结果:
3.反思:但是有一个问题就是如果想在客户端修改图表的类型需要在客户端代码上修改,违反了开闭原则,解决方法之一是可以将静态工厂方法的参数存储到XML文件中,通过XML.Util来获取字符串。在客户端引用获取到的字符串来创建图表。
所有的工厂模式都强调一点:两个类A和B之间的关系应该仅仅只是A创建B或者A使用B,而不能两种关系都有,将对象的创建和使用分离,使得系统更加符合单一职责原则,有利于对系统的复用和系统的维护。
简单工厂模式的简化可以将抽象产品类和工厂类合并,将静态工厂方法移至抽象产品类中。