第二种方式:
package com.dy.xidian; public class CarFactory { public static Car createAuDi(){ return new AuDi(); } public static Car createBiYaDi(){ return new BiYaDi(); } }
工厂方法模式
简单工厂中没添加一个新的类就需要去修改原有的工厂代码,这样的有点不好维护。
为每个具体的类都定义了一个具体的工厂类,当我们有新的类时,只需要增加该类以及其工厂类就可以了。
抽象工厂类:
package com.dy.xidian; public interface CarFactory { public Car createCar(); }
具体工厂类:
package com.dy.xidian; public class AuDiFactory implements CarFactory { @Override public Car createCar() { return new Audi(); } }
调用方式:
public class Client{ Car AuDi = new AuDiFactory.createCar(); }
如果需要曾加一个大众,那么只需要增加两个类文件DaZhong.java以及DaZhongFactory.java就可以了。但是这样也有个问题,就是每次都要增加两个文件,当类的数量庞大的时候也不好管理,所以一般情况下选用简单工厂模式。
抽象工厂模式
简单工厂只能生产一种产品,比如发动机工厂只能生产发动机,轮胎工厂只能生产轮胎,汽车外壳工厂只能生产外壳。如果需要一个由这三种产品构成的一个小汽车的话就无能为力了,这就是设计的到产品族的概念。产品族是多种产品的有机组合,通过抽象工厂方法,我们可以将各个产品组合起来构成一个产品族,而在组合的时候用户可以自行选择各个产品,比如发动机可以选择比较好,而轮胎选择便宜的等等。
Engine.java
package com.dy.xidian; public interface Engine { void run(); void start(); } class LuxuryEngine implements Engine { @Override public void run() { System.out.println("跑得快"); } @Override public void start() { System.out.println("启动快"); } } class LowerEngine implements Engine { @Override public void run() { System.out.println("跑得慢"); } @Override public void start() { System.out.println("启动慢"); } }
Seat.java
package com.dy.xidian; public interface Seat { void comfortable(); } class LuxurySeat implements Seat { @Override public void comfortable() { System.out.println("舒适"); } } class LowerSeat implements Seat { @Override public void comfortable() { System.out.println("不舒适"); } }
Shell.java
package com.dy.xidian; public interface Shell { public void meterial(); } class LuxuryShell implements Shell { @Override public void meterial() { System.out.println("铁的"); } } class LowerShell implements Shell { @Override public void meterial() { System.out.println("塑料的"); } }
CarFactory.java
package com.dy.xidian; public interface CarFactory { Engine createEngine(); Seat createSeat(); Shell createShell(); }
LowerCarFactory.java
package com.dy.xidian; public class LowerCarFactory implements CarFactory { @Override public Engine createEngine() { return new LowerEngine(); } @Override public Seat createSeat() { return new LowerSeat(); } @Override public Shell createShell() { return new LowerShell(); } }
LuxuryCarFactory.java
package com.dy.xidian; public class LowerCarFactory implements CarFactory { @Override public Engine createEngine() { return new LowerEngine(); } @Override public Seat createSeat() { return new LowerSeat(); } @Override public Shell createShell() { return new LowerShell(); } }
MiddleCarFactory.java
package com.dy.xidian; public class MiddleCarFactory implements CarFactory { @Override public Engine createEngine() { return new LowerEngine(); } @Override public Seat createSeat() { return new LuxurySeat(); } @Override public Shell createShell() { return new LowerShell(); } }
Client
package com.dy.xidian; public class Client { public static void main(String[] args) { CarFactory factory = new LuxuryCarFactory(); Engine e = factory.createEngine(); Seat seat = factory.createSeat(); Shell shell = factory.createShell(); e.run(); e.start(); seat.comfortable(); shell.meterial(); } }
创建一个高档汽车出来
工厂模式要点
简单工厂模式(静态工厂模式)
- 某种程度不符合设计原则,但实际使用最多
工厂方法模式
- 不修改已有类的情况下通过增加新的工厂类实现扩展
抽象工厂模式
- 不可以增加产品,但可以增加产品族
应用场景
JDK中的Calendar的getInstance方法
XML解析时的DocumentBuilerFactory创建解析器对象
反射中Class对象的newInstance()