简单工厂模式
介绍
- 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
- 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
- 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.
案例
客户买车
//车的抽象类
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 {
//方法1
public 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;
}
}
/*
//方法2
public 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{
@Override
public Car getCar() {
return new Tesla("特斯拉");
}
}
//五菱工厂
public class WulingFactory implements Factory{
@Override
public Car getCar() {
return new Wuling("五菱宏光");
}
}
//扩展一个大众车子类,并不需要改变原来的代码
public class Dazhong extends Car{
public Dazhong(String name) {
super(name);
}
}
public class DazhongFactory implements Factory{
@Override
public 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{
@Override
public void open() {
System.out.println("小米手机开机");
}
@Override
public void call() {
System.out.println("小米手机打电话");
}
@Override
public void sendMessage() {
System.out.println("小米手机发信息");
}
@Override
public void close() {
System.out.println("小米手机关机");
}
}
//华为手机
public class HuaweiPhone implements Phone{
@Override
public void open() {
System.out.println("华为手机开机");
}
@Override
public void call() {
System.out.println("华为手机打电话");
}
@Override
public void sendMessage() {
System.out.println("华为手机发信息");
}
@Override
public void close() {
System.out.println("华为手机关机");
}
}
//抽象路由类
public interface Route {
void open();
void set();
void close();
}
//小米路由
public class XiaomiRoute implements Route{
@Override
public void open() {
System.out.println("小米路由器开启");
}
@Override
public void set() {
System.out.println("小米路由器设置");
}
@Override
public void close() {
System.out.println("小米路由器关闭");
}
}
//华为路由
public class HuaweiRoute implements Route{
@Override
public void open() {
System.out.println("华为路由器开启");
}
@Override
public void set() {
System.out.println("华为路由器设置");
}
@Override
public void close() {
System.out.println("华为路由器关闭");
}
}
//抽象超级工厂(创建工厂的工厂)
public interface SuperFactory {
public Phone productPhone();
public Route productRoute();
}
//小米工厂
public class XiaomiFactory implements SuperFactory{
@Override
public Phone productPhone() {
return new XiaomiPhone();
}
@Override
public Route productRoute() {
return new XiaomiRoute();
}
}
//华为工厂
public class HuaweiFactory implements SuperFactory{
@Override
public Phone productPhone() {
return new HuaweiPhone();
}
@Override
public 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)不要覆盖基类中已经实现的方法。