最近在学习大话设计模式,写一下自己的学习体会和实现小例子。
定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
理解:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。像下面例子写的,电脑工厂里可以生产鼠标和键盘,然后有戴尔和惠普两个品牌,当调用戴尔工厂的时候,生产出来的就是戴尔的键盘和鼠标
代码:
电脑工厂:可以生产键盘和鼠标:
public interface PcFactory { //生产鼠标 Mouse createMouse(); //生产键盘 Keybo createKeybo(); }
电脑工厂里有两个品牌生产键盘鼠标:
戴尔:
public class DellFactory implements PcFactory { @Override public Mouse createMouse() { return new DellMouse(); } @Override public Keybo createKeybo() { return new DellKeybo(); } }
惠普:
public class HpFactory implements PcFactory { @Override public Mouse createMouse() { return new HpMouse(); } @Override public Keybo createKeybo() { return new HpKeybo(); } }
产品——鼠标接口:
public interface Mouse { void build(); }
产品——键盘接口:
public interface Keybo { void build(); }
产品的实现类:
鼠标:
public class DellMouse implements Mouse { @Override public void build() { System.out.println("戴尔鼠标"); } }
public class HpMouse implements Mouse { @Override public void build() { System.out.println("惠普鼠标"); } }
键盘:
public class DellKeybo implements Keybo { @Override public void build() { System.out.println("戴尔键盘"); } }
public class HpKeybo implements Keybo { @Override public void build() { System.out.println("惠普鼠标"); } }
测试:
public static void main(String[] args) { PcFactory factory = new DellFactory(); Keybo keybo = factory.createKeybo(); keybo.build(); Mouse mouse = factory.createMouse(); mouse.build(); }
抽象工厂模式和反射的改进:
由于每一次加一个品牌就要增加PcFactory的子类XXfactory,利用抽象可以简化代码:
public class Factory { public Mouse createMouse(String name){ Mouse mouse = null; String path = "pattern.abstractfactory.Interface.mouseImpl." + name; try { mouse = (Mouse) Class.forName(path).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); } return mouse; } public Keybo createKeybo(String name){ Keybo keybo = null; String path = "pattern.abstractfactory.Interface.keyboImpl." + name; try { keybo = (Keybo) Class.forName(path).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); } return keybo; } }
测试:
public static void main(String[] args) { Factory factory = new Factory(); Mouse mouse = factory.createMouse("DellMouse"); if (mouse != null){ mouse.build(); } }