简单工厂模式
简单工厂模式又叫做静态工厂方法模式(static Factory Method pattern),它是通过使用静态方法接收不同的参数来返回不同的实例对象(这些产品类继承自一个父类或接口)。
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
抽象产品(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
代码展示
interface IKeyboard{void inPrint();void outPrint();
}
class DelKeyboard implements IKeyboard{@Overridepublic void inPrint() {System.out.println("使用功戴尔的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用功戴尔的键盘输出");}
}
class HPKeyboard implements IKeyboard{@Overridepublic void inPrint() {System.out.println("使用惠普的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用惠普的键盘输出");}
}
class LenovoKeyboard implements IKeyboard{@Overridepublic void inPrint() {System.out.println("使用联想的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用联想的键盘输出");}
}
class IKeyboardFactory{public static IKeyboard createKeyboard(String brand){IKeyboard keyboard = null;switch (brand){case "HP":keyboard = new HPKeyboard();break;case "Lenovo":keyboard = new LenovoKeyboard();break;case "Del":keyboard = new DelKeyboard();break;}return keyboard;}
}
public class SimpleFactory {public static void main(String[] args) {IKeyboard hp = IKeyboardFactory.createKeyboard("HP");hp.inPrint();//使用惠普的键盘输入hp.outPrint();//使用惠普的键盘输出}
}
工厂方法模式
工厂模式是简单工厂模式的升级版,满足了开闭原则(对扩展开放,对修改关闭),解决了简单工厂模式的灵活性差的缺点。工厂模式将创建对象的工作交给了工厂的子类(延迟创建对象)。这样,在需要新增的时候就可以不破坏原来的结构
代码展示
interface IKeyboard{void inPrint();void outPrint();
}
class DelKeyboard implements IKeyboard {@Overridepublic void inPrint() {System.out.println("使用功戴尔的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用功戴尔的键盘输出");}
}
class HPKeyboard implements IKeyboard {@Overridepublic void inPrint() {System.out.println("使用惠普的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用惠普的键盘输出");}
}
class LenovoKeyboard implements IKeyboard {@Overridepublic void inPrint() {System.out.println("使用联想的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用联想的键盘输出");}
}
interface IKeyboardFactory{IKeyboard createKeyboard();
}
class DelKeyboardFactory implements IKeyboardFactory{@Overridepublic IKeyboard createKeyboard() {return new DelKeyboard();}
}
class HPKeyboardFactory implements IKeyboardFactory{@Overridepublic IKeyboard createKeyboard() {return new HPKeyboard();}
}
class LenovoKeyboardFactory implements IKeyboardFactory{@Overridepublic IKeyboard createKeyboard() {return new LenovoKeyboard();}
}
public class FactoryMethod {public static void main(String[] args) {IKeyboardFactory LenovoKeyboardFactory = new LenovoKeyboardFactory();//获得联想键盘工厂IKeyboard lenovokeyboard = LenovoKeyboardFactory.createKeyboard();//使用联想键盘工厂造具体键盘lenovokeyboard.inPrint();//使用联想的键盘输入lenovokeyboard.outPrint();//使用联想的键盘输出}
}
优缺点:其中最主要的是 IFactory类中的createKeyboard方法,通过这个方法来生成具体产品,这也是为什么叫工厂方法的原因。和简单工厂的静态方法不同,这里是使用的非静态调用方式。而且可以发现,没有了简单工厂中的 if-else逻辑判断,相对而言扩展性也要强的多。
优点:完全实现开闭原则,实现了可扩展和更复杂的层次结构。明确了职责,具有多态性,适用于任何实体类。
缺点:如果业务增加,会使得系统中类的个数成倍增加,提高了代码的复杂度
抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)属于创建型模式,它实际上是对工厂方法模式的扩展,相当于一个超级工厂,用于创建其他工厂的模式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,而且每个工厂都能按照工厂模式提供对象。其实抽象工厂也是为了减少工厂方法中的子类和工厂类数量,基于此提出的设计模式。
子类提供的方案是一个产品簇cu,是互相匹配的产品。
抽象工厂的本质是:选择产品簇的实现
代码展示
interface IKeyboard{void inPrint();void outPrint();
}
interface IMouse{void click();
}
interface IMonitor{void show();
}
class DelKeyboard implements IKeyboard{@Overridepublic void inPrint() {System.out.println("使用功戴尔的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用功戴尔的键盘输出");}
}
class DelMonitor implements IMonitor{@Overridepublic void show() {System.out.println("使用戴尔的显示屏观看");}
}
class DelMouse implements IMouse{@Overridepublic void click() {System.out.println("使用戴尔的鼠标点击");}
}
class HPKeyboard implements IKeyboard{@Overridepublic void inPrint() {System.out.println("使用惠普的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用惠普的键盘输出");}
}
class HPMonitor implements IMonitor{@Overridepublic void show() {System.out.println("使用戴尔的显示屏观看");}
}
class HPMouse implements IMouse{@Overridepublic void click() {System.out.println("使用惠普的鼠标点击");}
}
interface IFactory{IMouse createMouse();IMonitor createMonitor();IKeyboard createKeyboard();
}
//创建具体的戴尔工厂用于生产各种戴尔的产品
class DelFactory implements IFactory{@Overridepublic IMouse createMouse() {return new DelMouse();}@Overridepublic IMonitor createMonitor() {return new DelMonitor();}@Overridepublic IKeyboard createKeyboard() {return new DelKeyboard();}
}
//创建具体的惠普工厂用于生产各种惠普的产品 根据需要是否把工厂设置为单例模式
class HPFactory implements IFactory{@Overridepublic IMouse createMouse() {return new HPMouse();}@Overridepublic IMonitor createMonitor() {return new HPMonitor();}@Overridepublic IKeyboard createKeyboard() {return new HPKeyboard();}
}
//相当于客户端
public class AbstractFactory {public static void main(String[] args) {IFactory iFactory = new HPFactory();//获取惠普工厂//使用惠普的工厂创建具体的产品IKeyboard keyboard = iFactory.createKeyboard();IMonitor monitor = iFactory.createMonitor();IMouse mouse = iFactory.createMouse();keyboard.inPrint();monitor.show();mouse.click();}
}
优缺点:
优点:增加分组比较容易,而且能大大减少工厂类的数量
缺点:因为分组,所以分组中的产品扩展就比较困难,比如再新增一个IMouse鼠标,就需要改动IFactory、DellFactory和HPFactory几乎所有工厂类