软件设计七大原则
| 开闭原则 | 对扩展开放,对修改关闭 | 降低维护带来的新风险 |
|---|---|---|
| 依赖倒置原则 | 高层不应该依赖低层,要面向接口编程 | 更利于代码结构的升级扩展 |
| 单一职责原则 | 一个类只干一件事,实现类要单一 | 便于理解,提高代码的可读性 |
| 接口隔离原则 | 一个接口只干一件事,接口要精简单一 | 功能解耦,高聚合、低耦合 |
| 迪米特法则 | 不该知道的不要知道,一个类应该保持对其它对象最少的了解,降低耦合度 | 只和朋友交流,不和陌生人说话,减少代码臃肿 |
| 里氏替换原则 | 不要破坏继承体系,子类重写方法功能发生改变,不应该影响父类方法的含义 | 防止继承泛滥 |
| 合成复用原则 | 尽量使用组合或者聚合关系实现代码复用,少使用继承 | 降低代码耦合 |
1.定义:简单来说就是在实例化对象的时候不在使用new Object()这个形式,而是3可以根据用户的选择条件来 实例化相对应需要的类。对于客户端来说,去除了具体类的相关依赖。只需要给出具体的实例给工厂,工厂就会自动返回具体的实例对象。

在创建车型的时候我们一共有三种选择的车型:Hongqi,Biyadi,Benz,各自可以生产:红旗,比亚迪,奔驰。我们创建有个工厂类来根据用户输入的车型,创建其相对应的类:
汽车类
- public interface Car {
- void createCar();
- }
-
具体车型实现Car接口
- public class HongqiCar implements Car {
- @Override
- public void createCar() {
- System.out.println("生产红旗");
- }
- }
-
- public class BenzCar implements Car{
- @Override
- public void createCar() {
- System.out.println("生产奔驰");
- }
- }
-
- public class BiyadiCar implements Car{
- @Override
- public void createCar() {
- System.out.println("生产比亚迪");
-
- }
- }
-
创建工厂类:
- public class CarFactor {
-
- public Car createModel(String model){
- Car car=null;
- switch (model){
- case "比亚迪":
- car=new BiyadiCar();
- case "红旗":
- car=new HongqiCar();
- case "奔驰":
- car=new BenzCar();
- }
- return car;
- }
-
- }
-
测试:
- public class test {
-
- public static void main(String[] args) {
- CarFactor carFactor = new CarFactor();
- Car car = carFactor.createModel("比亚迪");
- car.createCar();
- }
-
-
- }
输出:生产比亚迪
总结:简单工厂符合单一原则,用牺牲开闭的 方式来提高灵活性。
1.定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。

- //创建工厂接口CarFactory:
-
- public interface CarFactory {
- Car createCarFactory();
- }
-
-
- //创建具体类型的工厂:
-
- public class BenzFactory implements CarFactory {
- @Override
- public Car createCarFactory() {
- return new BiyadiCar();
- }
- }
-
- public class BiyadiFactory implements CarFactory{
- @Override
- public Car createCarFactory() {
- return new BiyadiCar();
- }
- }
-
- public class HongqiFactory implements CarFactory{
- @Override
- public Car createCarFactory() {
- return new HongqiCar();
- }
- }
-
-
-
- //测试
-
- public static void main(String[] args) {
- HongqiFactory hongqiFactory = new HongqiFactory();
- Car carFactory = hongqiFactory.createCarFactory();
- carFactory.createCar();
- }
-
-
-
- }
- //输出:生产比亚迪
总结:用户只需要知道具体工厂的名字,就可以得到想要的产品。
其满足单一原则,开闭原则,但是灵活性较差。
1.定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们

- //创建电车,油车,混能车的抽象接口
-
- public interface ECar {
- void createCar();
- }
-
- public interface HCar {
- void createCar();
- }
-
- public interface OCar {
- void createCar();
- }
-
-
- //创建具体品牌车型的具体类(其他车型以此类推)
-
- public class BenZECar implements ECar{
- @Override
- public void createCar() {
- System.out.println("奔驰电车");
- }
- }
-
- public class BenZHCar implements HCar{
- @Override
- public void createCar() {
- System.out.println("奔驰混合车");
- }
- }
-
- public class BenZOCar implements OCar {
-
- @Override
- public void createCar() {
- System.out.println("奔驰油车");
- }
-
- }
-
-
- //创建抽象车型工厂接口
-
- public interface CarFactory {
- ECar createEcar();
- OCar createOcar();
- HCar createHcar();
- }
-
-
-
- //创建具体品牌的工厂实现接口工厂CarFactory(其他品牌以此类推)
-
- public class BenZFactory implements CarFactory {
-
- @Override
- public ECar createEcar() {
- return new BenZECar();
- }
-
- @Override
- public OCar createOcar() {
- return new BenZOCar();
- }
-
- @Override
- public HCar createHcar() {
- return new BenZHCar();
- }
- }
-
- //测试
-
- public class test {
-
- public static void main(String[] args) {
- BenZFactory benZFactory = new BenZFactory();
- HCar hcar = benZFactory.createHcar();
- hcar.createCar();
- }
- }
总结:抽象方法符合单一原则,开闭原则,但是灵活性差
将工厂类替换为:
- public class SimpleAbstractCatFactory {
- public ECar createECars(String brand ){
-
- Ecar ecar = null;
- switch (brand) {
- case "比亚迪":
- ecar = new BIyadiEcar();
- break;
- case "红旗":
- ecar = new HongqiEcar();
- break;
- case "奔驰":
- ecar = new BenZEcar();
- break;
- }
- return ecar;
- }
- }
总结:抽象方法符合单一原则,不符合开闭原则,但是灵活性高
工厂模式小结
工厂方法模式与抽象工厂模式的区别在于:
(1)工厂方法只有一个抽象产品类和一个抽象工厂类,但可以派生出多个具体产品类和具体工厂类,每个具体工厂类只能创建一个具体产品类的实例。
(2)抽象工厂模式拥有多个抽象产品类(产品族)和一个抽象工厂类,每个抽象产品类可以派生出多个具体产品类;抽象工厂类也可以派生出多个具体工厂类,同时每个具体工厂类可以创建多个具体产品类的实例