网站建设公司排名前十,洛阳哪里有做网站的,职业教育网站建设方案,网站的信息架构1.简介
工厂模式是一种创建型设计模式#xff0c;通过提供一个接口或抽象类来创建对象#xff0c;而不是直接实例化对象。工厂模式的主要思想是将对象的创建与使用分离#xff0c;使得创建对象的过程更加灵活和可扩展。
工厂模式主要包括以下角色#xff1a;
抽象工厂通过提供一个接口或抽象类来创建对象而不是直接实例化对象。工厂模式的主要思想是将对象的创建与使用分离使得创建对象的过程更加灵活和可扩展。
工厂模式主要包括以下角色
抽象工厂Abstract Factory定义了一个创建产品对象的接口可以包含多个方法来创建不同类型的产品。具体工厂Concrete Factory实现抽象工厂接口负责实例化具体的产品对象。抽象产品Abstract Product定义了产品的接口或抽象类是工厂方法和抽象工厂模式中的基础。具体产品Concrete Product实现抽象产品接口具体定义产品的功能和行为。
2.简单工厂模式
简单工厂模式Simple Factory Pattern由一个工厂类根据传入的参数决定创建哪一种产品类的实例。它通常包含一个静态方法这个方法根据参数创建相应的对象。
定义一个简单的例子电脑有很多品牌如惠普电脑、联想电脑如果需要创建这两个对象时主动new出来使用了简单工厂模式后可以把创建的动作交给工厂类只需要指定参数即可获取对应的对象。
实现方法
编写产品类
首先创建一个Computer接口不同的产品实现这一接口
// 定义抽象产品接口
public interface Computer {void compute();
}// 定义具体产品实现该接口
public class HPComputer implements Computer{Overridepublic void compute() {System.out.println(我是惠普电脑);}
}public class LenovoComputer implements Computer{Overridepublic void compute() {System.out.println(我是联想电脑);}
}编写工厂类
简单工厂模式不存在抽象工厂只需编写一个工厂类即可。
// 根据传入的参数创建对应产品
public class SimpleFactory {public static Computer createProduct(String type) {if (type.equals(HP)) {return new HPComputer();} else if (type.equals(Lenovo)) {return new LenovoComputer();} else {throw new IllegalArgumentException(该类型无法被生产);}}
}测试类使用工厂创建产品
public class Main {public static void main(String[] args) {// 创建HP电脑Computer hp SimpleFactory.createProduct(HP);// 创建Lenovo电脑Computer lenovo SimpleFactory.createProduct(Lenovo);hp.compute();lenovo.compute();}
}输出结果如下 小结
简单工厂模式虽然实现比较简单但是工厂类的职责过重增加新的产品类型需要修改工厂类违背了开闭原则。 开闭原则 软件实体类、模块、函数等应该对扩展开放对修改关闭。 对扩展开放Open for extension软件实体应该允许在不改变其现有代码的情况下通过增加新功能来对其进行扩展。也就是说当软件的需求发生变化时我们应该能够通过添加新代码来满足这些需求而不需要修改已有的代码。 对修改关闭Closed for modification一旦软件实体被开发完成并投入使用其源代码就不应该再被修改。这可以防止对现有功能的破坏减少引入新的错误的风险并使软件更加稳定和可维护。 3.工厂方法模式
工厂方法模式Factory Method Pattern定义一个创建对象的接口但由子类决定实例化哪个类。工厂方法将对象的创建推迟到子类。
实现方法
编写产品类
// 定义抽象产品接口
public interface Computer {void compute();
}// 定义具体产品实现该接口
public class HPComputer implements Computer{Overridepublic void compute() {System.out.println(我是惠普电脑);}
}public class LenovoComputer implements Computer{Overridepublic void compute() {System.out.println(我是联想电脑);}
}编写工厂类
需要定义一个抽象工厂然后由具体工厂创建对应的产品。
// 定义抽象工厂
public interface ComputerFactory {Computer createComputer();
}// 定义HP工厂
public class HPComputerFactory implements ComputerFactory{Overridepublic Computer createComputer() {return new HPComputer();}
}// 定义Lenovo工厂
public class LenovoComputerFactory implements ComputerFactory{Overridepublic Computer createComputer() {return new LenovoComputer();}
}测试类使用不同的具体工厂创建产品
public class Main {public static void main(String[] args) {// 创建HP电脑HPComputerFactory hpFactory new HPComputerFactory();Computer hpComputer hpFactory.createComputer();hpComputer.compute();// 创建Lenovo电脑LenovoComputerFactory lenovoFactory new LenovoComputerFactory();Computer lenovoComputer lenovoFactory.createComputer();lenovoComputer.compute();}
}输出结果如下 小结
优点
遵循开闭原则新增产品时不需要修改现有系统代码只需要添加新的具体工厂和具体产品类。更符合单一职责原则每个具体工厂类只负责创建一种产品。
缺点
增加了系统复杂度需要增加额外的类和接口。
4.抽象工厂模式
抽象工厂模式Abstract Factory Pattern提供一个创建一系列相关或相互依赖对象的接口而无需指定它们具体的类。适用于产品族的场景即多个产品等级结构中相关的产品需要一起创建和使用。 产品等级结构 指产品的继承结构例如一个电脑抽象类它有HP电脑、Lenovo电脑等实现类那么这个电脑抽象类和他的实现类就构成了一个产品等级结构。 产品族 产品族是指由同一个工厂生产的位于不同产品等级结构中的一组产品。比如Lenovo除了生产电脑还可以生产打印机等其他产品。 实现方法
编写产品类
// 定义电脑抽象产品接口
public interface Computer {void compute();
}// 定义电脑具体产品实现该接口
public class HPComputer implements Computer{Overridepublic void compute() {System.out.println(我是惠普电脑);}
}public class LenovoComputer implements Computer{Overridepublic void compute() {System.out.println(我是联想电脑);}
}// 定义打印机抽象产品接口
public interface Printer {void print();
}// 定义打印机具体产品实现该接口
public class HPPrinter implements Printer {Overridepublic void print() {System.out.println(我是惠普打印机);}
}public class LenovoPrinter implements Printer{Overridepublic void print() {System.out.println(我是联想打印机);}
}编写工厂类
定义一个抽象工厂该工厂可以创建多个产品。
// 定义抽象工厂
public interface AbstractFactory {Computer createComputer();Printer createPrinter();
}// 定义HP工厂
public class HPFactory implements AbstractFactory{Overridepublic Computer createComputer() {return new HPComputer();}Overridepublic Printer createPrinter() {return new HPPrinter();}
}// 定义Lenovo工厂
public class LenovoFactory implements AbstractFactory {Overridepublic Computer createComputer() {return new LenovoComputer();}Overridepublic Printer createPrinter() {return new LenovoPrinter();}
}测试类使用不同的具体工厂创建产品
public class Main {public static void main(String[] args) {HPFactory hpFactory new HPFactory();Computer hpComputer hpFactory.createComputer();Printer hpPrinter hpFactory.createPrinter();hpComputer.compute();hpPrinter.print();System.out.println();LenovoFactory lenovoFactory new LenovoFactory();Computer lenovoComputer lenovoFactory.createComputer();Printer lenovoPrinter lenovoFactory.createPrinter();lenovoComputer.compute();lenovoPrinter.print();}
}输出结果如下 小结
优点
符合开闭原则新增产品族时无需修改现有系统代码。符合单一职责原则每个具体工厂类只负责创建一类产品族。保证产品族的一致性同一个工厂创建的产品是属于同一个产品族的。
缺点
增加了系统的复杂度。修改产品族时需要修改所有具体工厂类扩展性稍差。
5.总结 适用场景 简单工厂模式适用于产品种类较少客户端只需根据参数获得具体产品的简单场景。适合产品种类不经常变化的场合。 工厂方法模式适用于产品种类较多每个产品有相应的具体工厂类。适合需要扩展新产品且不希望修改现有代码的场合。 抽象工厂模式适用于产品族较多每个产品族中包含多个相关产品。适合创建一系列相关或相互依赖的产品且希望统一管理产品族的场合。