工厂模式

来源:互联网 发布:android 内存管理源码 编辑:程序博客网 时间:2024/06/08 12:42

工厂模式(实现了创建者与调用者的分离)

核心本质:实例化对象,用工厂方法代替new操作;将选择实现类、创建对象统一管理和控制,从而将调用者跟我们的实现类解耦。


分类

1 简单工厂模式:用来生产同一等级结构中的任意产品,只有一个工厂类。也叫静态工厂模式,就是工厂类一般使用静态方法,通过接受的参数来返回不同的对象实例(缺点:对于增加新的产品,需要修改已有代码,违反了开闭原则

 

2 工厂方法模式:有一组实现了相同接口的工厂类,不修改已有类的基础上,通过增加新的工厂类实现扩展

根据设计理论建议:工厂方法模式,但实际上一般使用简单工厂模式

 

3 抽象工厂模式:用来生产不同产品族的全部产品(不可以增加产品,但可以增加产品族);是工厂方法模式的升级版,在有多个业务品种,业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。


Java代码:

1简单工厂模式:

package factory.simplefactory;public class Audi implements Car {@Overridepublic void run() {System.out.println("奥迪在跑!");}}
package factory.simplefactory;public class Byd implements Car {@Overridepublic void run() {System.out.println("比亚迪在跑!");}}
package factory.simplefactory;public interface Car {void run();}
package factory.simplefactory;public class CarFactory {public static Car createCar(String type) {if ("奥迪".equals(type)) {return new Audi();} else if ("比亚迪".equals(type)) {return new Byd();} else {return null;}}}
package factory.simplefactory;//简单工厂类public class CarFactory2 {public static Car createAudi() {return new Audi();}public static Car createByd() {return new Byd();}}
注:CarFactory与CarFactory2都可以用在简单工厂模式


package factory.simplefactory;//测试在没有工厂模式的情况下public class Client01 { // 调用者public static void main(String[] args) {Car c1 = new Audi();Car c2 = new Byd();c1.run();c2.run();}}

package factory.simplefactory;//测试在简单工厂模式的情况下public class Client02 { // 调用者public static void main(String[] args) {Car c1 = CarFactory.createCar("奥迪");Car c2 = CarFactory.createCar("比亚迪");c1.run();c2.run();}}
注:Client01是在没有简单工厂模式下的测试类,Client02是在有简单工厂模式下的测试类



2  工厂方法模式

package factory.factorymethod;public class Audi implements Car {@Overridepublic void run() {System.out.println("奥迪在跑!");}}
package factory.factorymethod;public class Byd implements Car {@Overridepublic void run() {System.out.println("比亚迪在跑!");}}
package factory.factorymethod;public interface Car {void run();}

package factory.factorymethod;public interface CarFactory {Car createCar();}
package factory.factorymethod;public class AudiFactory implements CarFactory {public Car createCar() {return new Audi();}}

package factory.factorymethod;public class BydFactory implements CarFactory {public Car createCar() {return new Audi();}}
package factory.factorymethod;public class Client {public static void main(String[] args) {Car c1 = new AudiFactory().createCar();Car c2 = new BydFactory().createCar();c1.run();c2.run();}}



3 抽象工厂模式:


package factory.abstractFactory;public interface Engine {void run();void start();}class LuxuryEngine implements Engine {public void run() {System.out.println("转的快!");}public void start() {System.out.println("启动快!可以自动启停!");}}class LowEngine implements Engine {public void run() {System.out.println("转的慢!");}public void start() {System.out.println("启动慢!");}}

package factory.abstractFactory;public interface Seat {void massage();// 按摩}class LuxurySeat implements Seat {public void massage() {System.out.println("可以自动按摩!");}}class LowSeat implements Seat {public void massage() {System.out.println("不可以自动按摩!");}}

package factory.abstractFactory;public interface Tyre {void revolve();}class LuxuryTyre implements Tyre {public void revolve() {System.out.println("旋转不磨损");}}class LowTyre implements Tyre {public void revolve() {System.out.println("旋转磨损快");}}


package factory.abstractFactory;public interface CarFactory {Engine createEngine();Seat createSeat();Tyre createTyre();}

package factory.abstractFactory;public class LuxuryCarFactory implements CarFactory {public Engine createEngine() {return new LuxuryEngine();}public Seat createSeat() {return new LuxurySeat();}public Tyre createTyre() {return new LuxuryTyre();}}

package factory.abstractFactory;public class LowCarFactory implements CarFactory {public Engine createEngine() {return new LowEngine();}public Seat createSeat() {return new LowSeat();}public Tyre createTyre() {return new LowTyre();}}

package factory.abstractFactory;public class Client {public static void main(String[] args) {CarFactory factory = new LuxuryCarFactory();Engine e = factory.createEngine();e.run();e.start();}}







0 0
原创粉丝点击