简单工厂模式
在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。
简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。
这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,如果不使用简单工厂,那么所有的客户类都要知道所有子类的细节。而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。
简记: 一个工厂接口,一个工厂类,多个具体商品类
- 电脑接口
public interface Computer {
void printComputer();
}
- 具体电脑类一
public class AppleBook implements Computer {
public void printComputer() {
System.out.println("Apple Book");
}
}
- 具体电脑二
public class MacBook implements Computer {
public void printComputer() {
System.out.println("Mac Book");
}
}
- 电脑工厂类
public class ComputerFactory {
public static Computer newInstance(String name){
Computer instance = null;
if(name.equals("AppleBook")){
instance = new AppleBook();
}else if(name.equals("MacBook")){
instance = new MacBook();
}
return instance;
}
}
缺点:多个不同的商品,在同一个工厂中,相互之间存在细节暴露的问题。
工厂方法设计模式
改进简单工厂的缺点,提供多个工厂类,屏蔽不同商品间的细节。
- 抽象工厂类
public abstract class ComputerFactory {
public abstract void productComputer();
}
- 具体工厂类1
public class AppleFactory extends ComputerFactory {
public void productComputer() {
System.out.println("生产一台apple电脑");
}
}
- 具体工厂类2
public class MaxFactory extends ComputerFactory{
public void productComputer() {
System.out.println("生产一台max电脑");
}
}
抽象工厂设计模式
提供一个接口,用于创建 相关的对象家族 。本质上和工厂方法设计模式一样,可以理解为此时同一牌子的电脑有很多型号。然后每次创建对象的时候,都可以创建同一牌子的不同型号的多个电脑。