简单工厂模式
介绍
- 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
- 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
- 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.
案例
客户买车
//车的抽象类public abstract class Car {String name;public Car(String name) {this.name = name;}}//特斯拉汽车public class Tesla extends Car{public Tesla(String name) {super(name);}}//五菱汽车public class Wuling extends Car{public Wuling(String name) {super(name);}}
//车工厂public class Factory {//方法1public static Car getCar(String name){if (name.equals("特斯拉")){return new Tesla(name);}else if (name.equals("五菱")){return new Wuling(name);}else {System.out.println("没有此车");return null;}}/*//方法2public static Car getTesla(){return new Tesla("特斯拉");}public static Car getWuling(){return new Tesla("五菱");}*/}
//cliet端使用工厂对象就可以得到车子实例对象public class Client {public static void main(String[] args) {Car car = Factory.getCar("特斯拉");System.out.println(car.name);Car car1 = Factory.getCar("五菱");System.out.println(car1.name);}}
个人总结
简单工厂的弊端是:如果需要扩展工厂输出的实例对象,则需要修改工厂类的逻辑代码,违反了开闭原则
工厂方法模式
介绍
定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类
案例
客户买车
//车的抽象类public abstract class Car {String name;public Car(String name) {this.name = name;}}//特斯拉汽车public class Tesla extends Car{public Tesla(String name) {super(name);}}//五菱汽车public class Wuling extends Car{public Wuling(String name) {super(name);}}
//工厂抽象类public interface Factory {public Car getCar();}//特斯拉工厂public class TeslaFactory implements Factory{@Overridepublic Car getCar() {return new Tesla("特斯拉");}}//五菱工厂public class WulingFactory implements Factory{@Overridepublic Car getCar() {return new Wuling("五菱宏光");}}
//扩展一个大众车子类,并不需要改变原来的代码public class Dazhong extends Car{public Dazhong(String name) {super(name);}}public class DazhongFactory implements Factory{@Overridepublic Car getCar() {return new Dazhong("大众");}}
//Client根据需要买的车创建对应的车工厂得到车public class Client {public static void main(String[] args) {Car car1 = new TeslaFactory().getCar();System.out.println(car1.name);Car car2 = new WulingFactory().getCar();System.out.println(car2.name);Car car3 = new DazhongFactory().getCar();System.out.println(car3.name);}}
个人总结
工厂方法模式虽然符合开闭原则,但是编程难度和类的数量会增加,谨慎使用
抽象工厂模式
介绍
- 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
- 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
- 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
- 将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇, 更利于代码的维护和扩展。
原理
对原理类图的说明-即(职责链模式的角色及职责)
1)productA和productB是某产品的抽象类
2)productA1,productA2,productB1,productB2产品的具体实现类
3)Creator超级工厂(抽象),定义需要生产的抽象产品方法
4)ConcreteCreator1和ConcreteCreator2是具体的工厂
案例
需要生产华为的手机和路由器和小米的手机和路由器
//抽象手机类public interface Phone {void open();void call();void sendMessage();void close();}//小米手机public class XiaomiPhone implements Phone{@Overridepublic void open() {System.out.println("小米手机开机");}@Overridepublic void call() {System.out.println("小米手机打电话");}@Overridepublic void sendMessage() {System.out.println("小米手机发信息");}@Overridepublic void close() {System.out.println("小米手机关机");}}//华为手机public class HuaweiPhone implements Phone{@Overridepublic void open() {System.out.println("华为手机开机");}@Overridepublic void call() {System.out.println("华为手机打电话");}@Overridepublic void sendMessage() {System.out.println("华为手机发信息");}@Overridepublic void close() {System.out.println("华为手机关机");}}
//抽象路由类public interface Route {void open();void set();void close();}//小米路由public class XiaomiRoute implements Route{@Overridepublic void open() {System.out.println("小米路由器开启");}@Overridepublic void set() {System.out.println("小米路由器设置");}@Overridepublic void close() {System.out.println("小米路由器关闭");}}//华为路由public class HuaweiRoute implements Route{@Overridepublic void open() {System.out.println("华为路由器开启");}@Overridepublic void set() {System.out.println("华为路由器设置");}@Overridepublic void close() {System.out.println("华为路由器关闭");}}
//抽象超级工厂(创建工厂的工厂)public interface SuperFactory {public Phone productPhone();public Route productRoute();}//小米工厂public class XiaomiFactory implements SuperFactory{@Overridepublic Phone productPhone() {return new XiaomiPhone();}@Overridepublic Route productRoute() {return new XiaomiRoute();}}//华为工厂public class HuaweiFactory implements SuperFactory{@Overridepublic Phone productPhone() {return new HuaweiPhone();}@Overridepublic Route productRoute() {return new HuaweiRoute();}}
//Client端调用(需要哪一个品牌的产品,先把工厂new出来)public class Client {public static void main(String[] args) {System.out.println("================小米系列===================");XiaomiFactory xiaomiFactory = new XiaomiFactory();Phone phone1 = xiaomiFactory.productPhone();phone1.open();phone1.sendMessage();Route route1 = xiaomiFactory.productRoute();route1.open();route1.set();System.out.println("================华为系列===================");HuaweiFactory huaweiFactory = new HuaweiFactory();Phone phone2 = huaweiFactory.productPhone();phone2.open();phone2.sendMessage();Route route2 = huaweiFactory.productRoute();route2.open();route2.set();}}
工厂模式小结
- 工厂模式的意义将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
- 三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)
- 设计模式的依赖抽象原则
1)创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返2)回。有的书上说,变量不要直接持有具体类的引用。
2)不要让类继承具体类,而是继承抽象类或者是实现interface(接口)
3)不要覆盖基类中已经实现的方法。
