一:简单工厂模式/静态工厂模式(但不属于23种GOF设计模式之一)
简单工厂模式(又称为静态工厂方法模式):一个共同的接口指向不同的类。(它是单产品,单工厂的)
Factory可以是interface也可以是抽象的类
使用情况:创建一个复杂的对象的时候,可以创建一个工厂类;
创建一个简单的对象new就行,没有必要使用工厂模式,使用工厂类会增加复杂度,没有必要;
其他:interface中的成员变量默认是public static final修饰(这个地方可以写interface变量或者枚举变量)
1 工厂接口Factory
package com.cww.test.factory;
/**
* 简单工厂模式(又称为静态工厂方法模式):一个共同的接口指向不同的类。(它是单产品,单工厂的)
*/
public interface Factory {
void eat();
}
1 Dog和Cat类实现了Factory接口
public class Dog implements Factory{
public void eat() {
System.out.println("喂小狗狗吃饭饭");
}
}
public class Cat implements Factory{
public void eat() {
System.out.println("喂小猫咪吃饭饭");
}
}
2 简单工厂模式:
可以用if/switch进行分别创建对象(case后面只能跟常量,不能用switch,因为Cat.class.getName()是变量)
或者使用反射(比较方便)
package com.cww.test.factory;
/**
* 可以用if/switch进行分别创建对象(case后面只能跟常量,不能用switch,因为Cat.class.getName()是变量)
* 或者使用反射(比较方便)
*/
public class SimpleFactory {
public static final String CAT = Cat.class.getName();
public static final String DOG = Dog.class.getName();
public static Factory getEat(String i) {
Factory factory=null;
/*
=============== 1 :if/else ==========
if("cat".equals(i)){
factory=new Cat();
}else if("dog".equals(i)){
factory=new Dog();
}
=============== 2 :switch ==========
switch (i) {
case "cat":
factory = new Cat();
break;
case "dog":
factory = new Dog();
break;
}
=============== 3 :反射 ===========
*/
try {
factory=(Factory)Class.forName(i).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return factory;
}
}
3 客户端的使用:
/**
* 使用者
*/
public class User {
public static void main(String[] args) {
Factory cat = SimpleFactory.getEat(SimpleFactory.CAT);
cat.eat();
Factory dog = SimpleFactory.getEat(SimpleFactory.DOG);
dog.eat();
}
}
y:这样创建对象的时候不会暴露给客户端自己的业务逻辑,不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
n:这样要是添加一个功能,simpleFactory就违反了开闭原则(对修改关闭,对扩展开放),simpleFactory中就要进行修改此外,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
User类的运行结果:
喂小猫咪吃饭饭
喂小狗狗吃饭饭
二十三种设计模式之外(1:简单工厂模式总结完毕!)